ASP.NET Core WebAPI部署于IIS后无法启动问题求助
针对你的ASP.NET Core WebAPI IIS部署的关键注意点
结合你当前的Windows Server 2016环境(已装IIS 10、Web Deploy 3.6、.NET Core Runtime 2.0.7及Hosting Bundle),还有你Program.cs里的配置,我给你梳理几个容易踩坑的部署要点:
1. 先确认Hosting Bundle真的生效了
虽然你已经装了.NET Core Server Hosting Bundle,但还是要验证下IIS里的模块是否正常加载:
- 打开IIS管理器,找到站点的模块列表,确认有
AspNetCoreModule(这是.NET Core 2.x版本对应的IIS模块) - 如果没找到,建议卸载后重新安装Hosting Bundle,安装完成后一定要运行
iisreset重启IIS,不然模块不会生效
2. 修复Program.cs里的配置路径问题
你现在用 Directory.GetCurrentDirectory() 来设置配置文件的基础路径,在IIS托管环境下,这个方法返回的是IIS的默认工作目录(一般是C:\inetpub\wwwroot),而不是你的WebAPI应用所在的目录,很容易导致找不到appsettings.json。建议改成基于应用内容根路径的写法:
public static IWebHost BuildWebHost(string[] args) { return new WebHostBuilder() .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .ConfigureAppConfiguration((hostingContext, config) => { var env = hostingContext.HostingEnvironment; // 用环境的内容根路径作为配置文件的基础路径 config.SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); }) .UseIISIntegration() .UseStartup<Startup>() .Build(); }
另外别忘了在Visual Studio里把appsettings.json的属性改成复制到输出目录(右键文件→属性→复制到输出目录选“如果较新则复制”),不然部署后服务器上没有这个文件。
3. IIS站点和应用池的核心配置
- 物理路径:站点的物理路径必须指向你WebAPI发布后的根目录(就是包含web.config、bin文件夹的那个目录,别指向bin子文件夹)
- 应用池设置:
- .NET CLR版本一定要选无托管代码,因为ASP.NET Core是跨平台的,不需要IIS的托管代码支持
- 身份推荐用ApplicationPoolIdentity,同时要确保这个身份对你的应用目录有读写权限(如果你的API需要读写本地文件的话)
- 绑定配置:根据需求设置HTTP/HTTPS绑定,提前检查端口有没有被其他服务占用
4. Web Deploy部署的小细节
用Web Deploy部署时要注意这几点:
- 服务器上的Web Deployment Agent Service必须处于运行状态,不然连不上
- Visual Studio发布时选“Web Deploy”方式,输入的服务器地址、站点名称要和IIS里的一致,用户名需要有该站点的管理权限
- 部署完成后先访问API的基础路径(比如
http://你的服务器IP/api/你的控制器名),测试是否能正常响应
5. 出问题了怎么排查?
如果部署后出现500错误或者无法访问,优先看日志:
- ASP.NET Core日志:可以在web.config的
<aspNetCore>节点里开启stdout日志,添加配置:
然后手动在应用目录下创建<aspNetCore processPath="dotnet" arguments=".\你的Api.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" />logs文件夹,给应用池身份读写权限,这样错误日志会输出到这个文件夹里 - IIS日志:在IIS管理器里找到站点的日志选项,能看到每个请求的详细错误代码和信息,帮你定位问题
内容的提问来源于stack exchange,提问作者Berger




