从 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.core 2.2 迁移到 3.1。 Autofac.Core.DependencyResolutionException