You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动