我有一个 dotnet core v.2.1 应用程序,它利用“startup-class-by-environment-name-convention”Startup
为不同的环境使用不同的类,例如开发、登台和生产。该Program.Main.CreateWebHost
方法看起来与此类似:
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
var startupAssembly = Assembly.GetExecutingAssembly();
var webHostBuilder = WebHost.CreateDefaultBuilder(args)
.UseStartup(startupAssembly.FullName);
return webHostBuilder;
}
但是,在升级到 dotnet core v.2.2 之后(启动切换仍然很好用),我想尝试进程内托管功能。当切换到进程内托管模型并在本地运行 Visual Studio 2017 更新和 IIS Express 时,运行应用程序时出现以下错误:
HTTP 错误 500.30 - ANCM 进程内启动失败
此问题的常见原因:
- 应用程序启动失败
- 应用程序启动但随后停止
- 应用程序已启动,但在启动期间引发异常
故障排除步骤:
- 检查系统事件日志中的错误消息
- 启用记录应用程序进程的标准输出消息
- 将调试器附加到应用程序进程并检查
我检查了所有日志,我能找到的只有这个:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="IIS Express AspNetCore Module V2" />
<EventID Qualifiers="0">1007</EventID>
<Level>2</Level>
<Task>0</Task>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2018-12-14T10:37:48.327935100Z" />
<EventRecordID>3693</EventRecordID>
<Channel>Application</Channel>
<Computer>[whatever]</Computer>
<Security />
</System>
<EventData>
<Data>Application '/LM/W3SVC/2/ROOT' with physical root '[whatever again]' failed to load clr and managed application. CLR worker thread exited prematurely</Data>
<Data>Process Id: 29836.</Data>
<Data>File Version: 12.2.18316.0. Description: IIS ASP.NET Core Module V2 Request Handler. Commit: ce8cf65589734f82b0536c543aba5bd60d0a5a98</Data>
</EventData>
</Event>
我阅读了所有 dotnet core in-hosting migrate 2.1 -> 2.2 任何我能找到的 MSDN 文章,并尝试了一堆不同的设置,但除了使用默认设置之外找不到任何解决方案:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
... 哪个不行 - 我想将启动切换与进程内托管一起使用。有谁知道如何实现这一点,或者对如何进行故障排除有任何建议?
编辑:我从@cilerler 那里得到了我需要的答案。为了完整起见,这就是我的情况:
我的自定义配置文件加载失败,因为此过程依赖于对 的调用Directory.GetCurrentDirectory()
,其结果在切换到进程内托管时会发生变化。这是我那部分的原始代码(为简洁而缩短):
var basePath = $"{Directory.GetCurrentDirectory()}\\ConfigurationFiles";
builder.SetBasePath(basePath);
builder.AddJsonFile("some.config.json", false, true);
builder.AddJsonFile($"some.config.{context.HostingEnvironment.EnvironmentName}.json", true, true);
关键部分是 - 再次 - 调用GetCurrentDirectory()
,因此,为了解决这个问题,我根据接受的答案中的建议将上述内容更改为:
var currentDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var basePath = $"{currentDirectory}\\ConfigurationFiles";
builder.SetBasePath(basePath);
有关更多详细信息,请参阅接受的答案;)