资深.NET开发者实战:ASP.NET Core MVC部署到IIS详细步骤与常见问题解决方案

大家好,我是第八哥,一个有十年.NET开发经验的老司机。今天,我来分享如何把ASP.NET Core MVC应用顺利部署到IIS服务器。很多朋友初次尝试时,常常被IIS的错误问题搞得头大,别担心,我会一步步带你们搞定。

部署前的准备工作

俗话说:“兵马未动,粮草先行。“首先,我们要确保环境到位,否则后续会报错。

1、打开Windows的“添加功能”,勾选安装IIS服务器相关功能。

Windows 控制面板启用 IIS 功能界面
Windows 控制面板启用 IIS 功能界面

2、安装ASP.NET Core的运行时环境,确保IIS的模块中出现AspNetCoreModuleV2。

IIS 托管代码模块配置界面
IIS 托管代码模块配置界面

步骤1:发布ASP.NET Core MVC应用

在Visual Studio中,右击项目选“发布”。目标选“文件夹”,路径别用中文。配置为Release模式,发布后生成一个完整文件夹。

asp.net core 发布设置界面
asp.net core 发布设置界面

关键点:勾选“删除现有文件”,避免旧文件残留。发布后,测试本地运行dotnet YourApp.dll,确保无报错。

步骤2:配置IIS服务器

打开IIS管理器,右击“网站”选择“添加网站”,网站名称随意,物理路径指向发布的文件夹,端口用80或自定义端口,避免和已有的端口冲突,这里我使用的是8081端口,因为IIS有个默认的网站,使用的是80端口;如果你也想使用80端口,那就把默认的网站给停掉。

IIS设置网站名称及物理路径与绑定端口
IIS设置网站名称及物理路径与绑定端口

步骤3:设置应用程序池

打开“应用程序池”,找到我们刚刚添加的站点池,右击打开基本设置,在.NET CLR版本处选择无托管代码,因为ASP.NET Core是自托管的。

.NET CLR 版本下拉菜单选中「无托管代码」
.NET CLR 版本下拉菜单选中「无托管代码」

标识用ApplicationPoolIdentity,启动模式设为AlwaysRunning。这能提升性能,减少首次加载延迟。如果不是,可以在高级设置中进行修改。

启动模式有两种,区别如下:
AlwaysRunning‌:应用程序池始终保持预启动状态,减少首次请求延迟,但会增加内存占用。适用于高并发场景。 ‌
OnDemand‌:首次请求时启动应用程序池,资源利用率更低,适合访问频率较低的场景。

步骤4:测试与验证部署

在浏览器输入站点URL,比如http://localhost:8081。如果首页正常显示,那么恭喜你!但是常见的问题往往就在这时候冒头,检查事件查看器日志通常能快速定位错误源。

ASP.NET Core应用部署成功:Chrome 浏览器加载效果
ASP.NET Core应用部署成功:Chrome 浏览器加载效果

常见问题1:500.19错误

浏览器查看时,提示HTTP 错误 500.19 - Internal Server Error,通常是因为IIS无法加载应用程序的依赖项导致的,微软官网下载对应版本的Hosting Bundle进行安装,完成后检查IIS的模块,确保AspNetCoreModuleV2已加载。没看到?重启IIS试试。

常见问题2:405或500错误

应用部署后,遇到PUT或DELETE请求时,通常会出现这个错误,原因是IIS默认安装的WebDav模块阻止了这些请求。
我们可以打开项目的web.config文件,在<system.webServer>节点下添加如下代码:

<modules runAllManagedModulesForAllRequests="true">
  <remove name="WebDAVModule"/> <!-- 移除冲突模块 -->
</modules>

常见问题3:Access to the path is denied

当遇到IIS错误Access to the path 'C:\Windows\TEMP\ASPNETCORE_xxx.tmp' is denied时,通常是由于未启用加载用户配置文件‌导致的临时文件创建失败‌。
在应用程序池中找到我们的站点池,右击打开高级设置,在进程模型部分,将加载用户配置文件设置为True

总结与优化建议

部署过程其实不难,关键在细节。遇到问题时不要慌,多用日志排错。你们还遇到过哪些问题,欢迎留言交流,下期见。

上一篇 ASP.NET Core MVC Options深度指南 | IOptionsMonitor与IOptionsSnapshot区别解析及配置文件实时监听实战 下一篇 ASP.NET Core文件上传实战指南 | 3种主流方式详解与完整C#后端接收代码示例

评论

暂不支持评论