捕获 Kestrel 启动错误
Catching Kestrel Startup Errors
我是 运行 使用 Kestrel 的网站。我有一个 IWebHost
并在其上调用 .运行()。
var app = host.Build();
app.Run();
通常这很管用,但我有一个特殊情况让我很担心。有时指定的端口正在使用中。我知道我可以在 configuration/setup 期间检查一个端口是否在使用中,但是,在我检查之后但在 Kestrel 监听之前,有人总是有可能使用一个端口。而且,我确定还有其他问题可能导致 app.Run() 行失败。
当 app.Run()
失败时,我想将错误消息记录到日志文件中。问题是应用程序似乎崩溃了,我无法处理异常。
例如,我试过这个:
var app = host.Build();
try
{
app.Run();
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
但它根本不会命中 catch
代码。
我搜索并发现了很多全局异常处理的示例,这些示例似乎处理将用户重定向到错误页面,虽然我可能只是做错了,但我无法得到这些示例中的任何一个都可以工作。
错误信息类似于:
crit: Microsoft.AspNetCore.Server.Kestrel[0]
Unable to start Kestrel.
连同堆栈跟踪。我可以从命令行通过 运行 看到这个错误,但我的用户不会。这就是为什么我真的希望能够抓住它 this/log。
有人可以帮助我理解我做错了什么吗?
您需要设置.CaptureStartupErrors(false)
。文档 here.
public class Program
{
public static void Main(string[] args)
{
try
{
CreateWebHostBuilder(args).Build().Run();
}
catch(Exception ex)
{
Log.Fatal(ex, "App crashed");
}
finally
{
Log.CloseAndFlush();
}
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.CaptureStartupErrors(false) //allow startup errors to propagate
.UseStartup<Startup>();
}
我是 运行 使用 Kestrel 的网站。我有一个 IWebHost
并在其上调用 .运行()。
var app = host.Build();
app.Run();
通常这很管用,但我有一个特殊情况让我很担心。有时指定的端口正在使用中。我知道我可以在 configuration/setup 期间检查一个端口是否在使用中,但是,在我检查之后但在 Kestrel 监听之前,有人总是有可能使用一个端口。而且,我确定还有其他问题可能导致 app.Run() 行失败。
当 app.Run()
失败时,我想将错误消息记录到日志文件中。问题是应用程序似乎崩溃了,我无法处理异常。
例如,我试过这个:
var app = host.Build();
try
{
app.Run();
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
但它根本不会命中 catch
代码。
我搜索并发现了很多全局异常处理的示例,这些示例似乎处理将用户重定向到错误页面,虽然我可能只是做错了,但我无法得到这些示例中的任何一个都可以工作。
错误信息类似于:
crit: Microsoft.AspNetCore.Server.Kestrel[0]
Unable to start Kestrel.
连同堆栈跟踪。我可以从命令行通过 运行 看到这个错误,但我的用户不会。这就是为什么我真的希望能够抓住它 this/log。
有人可以帮助我理解我做错了什么吗?
您需要设置.CaptureStartupErrors(false)
。文档 here.
public class Program
{
public static void Main(string[] args)
{
try
{
CreateWebHostBuilder(args).Build().Run();
}
catch(Exception ex)
{
Log.Fatal(ex, "App crashed");
}
finally
{
Log.CloseAndFlush();
}
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.CaptureStartupErrors(false) //allow startup errors to propagate
.UseStartup<Startup>();
}