在 IIS (10.0.17763.1) 上托管 .net5.0 核心 Web api 时出现问题

Posted

技术标签:

【中文标题】在 IIS (10.0.17763.1) 上托管 .net5.0 核心 Web api 时出现问题【英文标题】:Problem hosting .net5.0 core web api on IIS (10.0.17763.1) 【发布时间】:2021-05-11 07:39:01 【问题描述】:

我在 IIS 上托管我的 .net core 5.0 Web api 时遇到问题,因此我决定创建一个开箱即用的基本版本 (WeatherForecast)。同样,这也不适用于 IIS(所以我不认为它不是我的代码)。我已经安装了 .Net Core Hosting Bundle 5.0 (V5.0.2) 并重新启动了 IIS (net stop was /y, net start w3svc)。

我的网站托管在https://authdev.XXXXXXXX.net/api/weatherforecast(其中 XXXXXXXX.net 在我的内部网络上)。服务器是 Microsoft Hyper-V Server 2019。我有一个单独的应用程序池,其中 .Net CLR 版本在集成管道模式下设置为“无托管代码”。我的网站设置了适当的绑定并正确配置。我已经通过创建一个从该服务器远程工作的 .Net Core 5.0 MVC 网站(开箱即用)确认了这一点)。我在进程外模式下得到 404(并且相同的 url 在本地工作,明显的服务器 url 更改)。我在一个阶段添加了日志信息,并注意到我的 Startup.cs 中的 public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 方法没有被命中。

Error message 500.30 - ASP.NET Core app failed to start

我认为此消息表明我的托管环境配置正确,但我的(开箱即用的)Web api 中存在错误。

程序.cs

public class Program

    public static void Main(string[] args)
    
        CreateHostBuilder(args).Build().Run();
    

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            
                webBuilder
                    .UseContentRoot(Directory.GetCurrentDirectory())
                    .UseKestrel()
                    .UseIISIntegration()
                    .UseStartup<Startup>();
            );

web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath=".\WebApplication4.exe" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
    </system.webServer>
  </location>
</configuration>
<!--ProjectGuid: 9f838b88-2902-4f1d-96d5-468aa0449fb0-->

Startup.cs

public class Startup
    
        public Startup(IConfiguration configuration)
        
            Configuration = configuration;
        

        public IConfiguration Configuration  get; 

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        
            services.AddControllers();
        

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        
            if (env.IsDevelopment())
            
                app.UseDeveloperExceptionPage();
            

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            
                endpoints.MapControllers();
            );
        
    

我已经尝试在进程内和进程外模式下运行它

处理中的日志

crit: Microsoft.AspNetCore.Hosting.Diagnostics[6]
      Application startup exception
      System.InvalidOperationException: Application is running inside IIS process but is not configured to use IIS server.
         at Microsoft.AspNetCore.Server.IIS.Core.IISServerSetupFilter.<>c__DisplayClass2_0.<Configure>b__0(IApplicationBuilder app)
         at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder app)
         at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken)
Unhandled exception. System.InvalidOperationException: Application is running inside IIS process but is not configured to use IIS server.
   at Microsoft.AspNetCore.Server.IIS.Core.IISServerSetupFilter.<>c__DisplayClass2_0.<Configure>b__0(IApplicationBuilder app)
   at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder app)
   at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken)
   at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost host)
   at WebApplication4.Program.Main(String[] args) in C:\Working\dev\sandbox\WebApplication4\WebApplication4\Program.cs:line 17

OutOfProcess 日志

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://127.0.0.1:43593
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
      Content root path: e:\websites\auth-api

【问题讨论】:

Don't call .UseKestrel() 使用 IIS 托管时 感谢您的快速回复。我删除了 .UseKestrel() 并重新部署。我在进程内和进程外模式下都得到了 404(我不希望进程外在没有红隼的情况下工作)。进程内模式的日志文件空白,但进程外具有熟悉的信息:Microsoft.Hosting.Lifetime[0] 现在正在监听:127.0.0.1:36553 信息:Microsoft.Hosting.Lifetime[0] 应用程序已启动。按 Ctrl+C 关闭。信息:Microsoft.Hosting.Lifetime[0] 托管环境:生产信息:Microsoft.Hosting.Lifetime[0] 内容根路径:e:\websites\auth-api 我现在无法测试它,但也许默认值已更改,您也必须明确调用 UseIIS() 抱歉,老实说,我已经以各种组合方式使用了所有三个.UseKestrel().UseIISIntegration().UseIIS(),但没有成功。我认为ConfigureWebHostDefaults 如果丢失,会自动设置其中的一些,但它似乎并没有给我我需要的设置。我很好奇为什么在 IIS 服务器上使用进程内模式时,我的 Configure 方法没有在 Startup.cs 中调用。 【参考方案1】:

您确定要作为独立包发布吗?因为如果不是,你的配置应该是这样的:

      <aspNetCore processPath="dotnet"
                  arguments=".\WebApplication16.dll"
                  stdoutLogEnabled="false"
                  stdoutLogFile=".\logs\stdout"
                  hostingModel="inprocess" />

【讨论】:

嗨,肖恩,感谢您查看此内容。我在我的 web.config 中替换了它,将进程路径更改为“.\WebApplication5.exe”并将参数更改为“.\WebApplication5.dll”我在日志Application is running inside IIS process but is not configured to use IIS server. 中得到一个 404 和相同的错误 好的,现在可以使用了。感谢您的所有帮助肖恩和马蒂亚斯 Shawn,你的 cmets 真的很有帮助。我认为我没有将其配置为 100% 正确,因为 inprocess 仍然无法正常工作,但它现在可以与 outofprocess 一起使用。您对独立包的评论促使我重新配置我的发布。它现在是独立的目标 win-x64。 web.config 现在有&lt;aspNetCore processPath=".\WebApplication5.exe" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" hostingModel="outofprocess" /&gt;,这似乎可以让事情正常进行。另外,我的网址也犯了一个错误,它应该是 .../weatherforecast 而不是 .../api/weatherforecast。

以上是关于在 IIS (10.0.17763.1) 上托管 .net5.0 核心 Web api 时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

在具有 80 端口的 IIS 上托管 2 个网站 1,在 Xampp 8081 端口上托管 1 个网站

在 IIS6 上托管 WCF,是不是需要任何特殊设置?

WCF REST - 在 IIS 6 上托管的问题

在 IIS 上托管 Wordpress 时建立数据库连接时出错

在 IIS 上托管后,引导字形图标显示为问号

在多个绑定上托管 IIS 站点时如何获取正确的本地地址 URI?