iis 当出现未处理的异常时,ASP.NETCore如何生成500状态代码?

sdnqo3pr  于 2024-01-08  发布在  .NET
关注(0)|答案(2)|浏览(170)

如果我们在中间件中抛出一个未处理的异常,

throw new System.Exception();

字符串
浏览器将显示:
此页面无法显示,无法找到请求的页面
但是当有一个未处理的异常时,ASP.NET Core是如何生成http 500状态代码的呢?有人能指出https://source.dot.net/的源代码,并显示哪个类有一个“try catch”块来处理异常并将响应代码设置为500吗?
我试图找到代码在GenericWebHostService(https://source.dot.net/#Microsoft.AspNetCore. Hosting/GenericHost/GenericWebHostService.cs,fd 20321226 ab 7078)
但我找不到相关的代码
对于那些要求在ASP.NET核心源代码中设置断点调试的人,如果你在中间件中抛出一个异常,

public class MyMiddleware
{
    private RequestDelegate next;

    public MyMiddleware(RequestDelegate requestDelegate) =>
        next = requestDelegate;

    public async Task Invoke(HttpContext context)
    {
        throw new System.Exception();  // <----it won't break in VS because the unhandled exception is swallowed by asp.net infrastructure
        await next(context);
    }
}


但是这个异常不会中断执行流程,这就是为什么浏览器显示500错误代码,所以一定是某个组件吞下了这个未处理的异常,我想知道是哪个组件/类这样做的

twh00eeo

twh00eeo1#

在Visual Studio中,转到Debug > Windows > Exception Settings > Common Language Runtime Exceptions并选中System.Exception
或者另一种简单的方法,进入正常操作并抛出新的异常,您可以看到以下窗口显示,并确保选中第一个选项:

wqlqzqxt

wqlqzqxt2#

对于来自dotnet new web的一个简单示例(我针对.NET 7进行了测试),您可以将其在Program.cs中的代码更改为

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.Use(async (context, next) =>
{
    throw new Exception("Something went wrong!");
    // Log the request
    Console.WriteLine($"Received request: {context.Request.Method} {context.Request.Path}");

    // Call the next middleware
    await next.Invoke();
});

app.MapGet("/", () => "Hello World!");

app.Run();

字符串
如果在throw new行上设置断点并进一步调试,您应该看到try-catch对位于DeveloperExceptionPageMiddlewareImpl类中,

/// <summary>
    /// Process an individual request.
    /// </summary>
    /// <param name="context"></param>
    /// <returns></returns>
    public async Task Invoke(HttpContext context)
    {
        try
        {
            await _next(context); // => Your exception from the middleware is  caught here.
        }
        catch (Exception ex)
        {
            _logger.UnhandledException(ex);


对于您的特定示例,您正在查找的try-catch对可能位于另一个位置,但简单的调试应该可以显示位置。

相关问题