从 2.2 迁移到 3.1 的 ASP.Net Core 解决方案在发布时不会运行

Posted

技术标签:

【中文标题】从 2.2 迁移到 3.1 的 ASP.Net Core 解决方案在发布时不会运行【英文标题】:ASP.Net Core solution migrated from 2.2 to 3.1 won't run when published 【发布时间】:2019-12-31 14:04:52 【问题描述】:

这是我从 ASP.Net Core 2.2 更新到 3.1 的第二个项目。第一个运行良好。第二个在 Visual Studio (2019) 中运行良好,但是当你发布它并从 dotnet CLI 运行它时,控制台只是无限期挂起,控制台中没有输出,我启用了 stdout,输出文件为零字节。

该解决方案托管在 IIS 中,当我尝试通过 IIS 运行它时,我在应用程序事件日志中获得以下条目:

物理根目录为“D:\wwwroot\InclusionService_UAT\”的应用程序“/LM/W3SVC/2/ROOT”无法使用命令行“C:\Program Files\dotnet\dotnet.exe .\InclusionService.Web”启动进程。 dll' 在阶段 'PostStartCheck',ErrorCode = '0x8027025a',分配端口 12973,retryCounter '1'。

物理根目录为“D:\wwwroot\InclusionService_UAT\”的应用程序“/LM/W3SVC/2/ROOT”无法使用命令行“C:\Program Files\dotnet\dotnet.exe .\InclusionService.Web”启动进程。 dll' 多次重试。无法绑定到端口“35033”。多次重试捕获的 stdout 和 stderr 日志的前 30KB 字符:没有更多显示

这是我的 Program.cs,在我的其他迁移解决方案中完全相同:

public static void Main(string[] args)

    var builder = new HostBuilder()
       .ConfigureWebHostDefaults(opt =>
       
             opt.UseStartup<Startup>();
             opt.UseIISIntegration();
        );

    var host = builder.Build();
    host.Start();

如果有一些输出,调试会容易得多,但没有什么可继续的。

【问题讨论】:

您是否尝试过禁用 Startup.cs 中的所有内容以查看问题是否与某些服务注册有关? @AndrewSimon 我已强制在 Startup.cs 中的 ConfigureServices()Configure() 方法的末尾抛出异常,并且两次异常都显示在控制台输出中,这让我相信服务注册没问题... 如果它到达 Startup.cs 的末尾,那么它应该可以正确加载。调用特定端点时是否发生错误?加载应用程序的第一个请求是什么? @AndrewSimon 启动时出现错误。当我尝试在 IIS 中启动应用程序时,我只会收到 HTTP Error 502.5 - ANCM Out-Of-Process Startup Failure 错误。 您检查过应用程序或系统事件日志吗? 【参考方案1】:

请参阅 Yush0 的答案以获得正确的解决方案。

问题归结为在Program.cs 中使用新的IHost 而不是现有的IWebHost

值得注意的是,IHost 在迁移到带有 Razor Pages 的 .NET Core 3.1 时效果很好,但这个解决方案是 MVC 应用程序,并且只能在带有 IWebHost 的 IIS 中工作。

当我将原始代码放回如下时,应用程序立即在 IIS 中启动:

public class Program

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

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseIISIntegration();

【讨论】:

问题是 WebHostBuilder 正在贬值 代码有问题,就像@fletchsod 说的那样。不建议在 .NET Core 3.1 中使用 WebHostBuilder。对于其他 SO 用户,这不是普遍适用的答案。 @EriawanKusumawardhono 谢谢。我已更改接受的答案。【参考方案2】:

我还必须确保 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=".\MyApp.exe" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
    </system.webServer>
  </location>
</configuration>

指定 hostingModel 对我有用。

program.cs 似乎没有什么区别,但看起来如下(没有弃用的 WebHostBuilder):

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

【讨论】:

【参考方案3】:

所以,我目前正在做同样的事情。我必须使用 UseIIS()not UseIISIntegration()

摘录如下:

.ConfigureWebHostDefaults(webBuilder => 
 
    webBuilder.UseStartup<T>().UseIIS(); 

另外,请确保您的 IIS 服务器上的托管包已更新:

https://dotnet.microsoft.com/download/dotnet-core/3.1

【讨论】:

我只尝试了UseIISIntergration()UseIIS() 和两者。每次的结果都是一样的,应用程序就是无法启动。【参考方案4】:

您好,我有类似的问题并没有在上述所有过程中起作用。 我必须创建一个新的 .net 3.1 核心项目,然后将代码从 2.2 迁移到新创建的项目,该项目解决了我的问题并成功运行。 发布后,我在 3.1 版中看到创建了几个新文件夹。

希望对某人有所帮助 谢谢

【讨论】:

以上是关于从 2.2 迁移到 3.1 的 ASP.Net Core 解决方案在发布时不会运行的主要内容,如果未能解决你的问题,请参考以下文章

迁移到 ASP.NET 3.1 - 从登录控制器路由到 Razor 页面主页索引页面不再工作

从 MVC 迁移到 ASP.NET Core 3.1 中的端点路由时,具有角色的 AuthorizeAttribute 不起作用

使用 ADFS 的 JWT Bearer 身份验证将 ASP.NET Framework 迁移到 ASP.NET Core 3.1

从 Body 迁移 .NET Core 2.2 到 3.1 集成测试始终为空

ASP.NET Core教程

从 asp.core 2.2 迁移到 3.1。 Autofac.Core.DependencyResolutionException