usedeveloperexceptionpage 中间件

我们谈谈在 startup 类的 configure()方法中以下代码:

public void configure(iapplicationbuilder app, ihostingenvironment env)
{
    if (env.isdevelopment())
    {
        app.usedeveloperexceptionpage();
    }

    app.usefileserver();

    app.run(async (context) =>
    {
     throw new exception("您的请求在管道中发生了一些异常,请检查。");
        await context.response.writeasync("hello world!");
    });
}

如果我们使用上面的代码运行我们的应用程序,我们看不到异常,而是看到“来自 default.html 页面中的 hello”。如果您了解 asp.net core 请求处理管道的工作原理,那么您可能已经知道我们没有看到我们抛出的异常的原因。

usefileserver中间件结合了usedefaultfilesusestaticfiles中间件的功能。在我们之前的系列视频中,我们在 wwwroot 文件夹中包含了一个名为default.html的默认 html 文档。

因此,对应用程序根 url 的请求即http://localhost:49119usefileserver处理中间件和管道从那里反转。因此,在我们run()方法注册的请求管道中的下一个中间件也无法执行,因此我们不会看到此中间件抛出的异常。

现在,如果我们向http://localhost:49119/abc.html发出请求,我们会看到异常。因为,在这种情况下,usefileserver中间件找不到名为abc.html的文件。 它会继续去调用管道中的下一个中间件,在我们的例子中是我们使用run()方法注册的中间件。此中间件抛出异常,我们按预期看到异常详细信息。

如果您对传统的 asp.net 有任何经验,那么您必须非常熟悉此页面。这类似于传统的 asp.net 中的黄色死亡屏幕

developer exception页面包含异常详细信息 :

  • 堆栈跟踪,包括导致异常的文件名和行号
  • query string, cookies 和 http headers

目前,在异常页面的“query ”选项卡上,我们看到“无 querystring 数据”。如果请求 url 中有任何查询字符串参数,如下所示,您将在“query ”选项卡下看到它们。

http://localhost:48118/abc.html?country=person&state=islocked

自定义 usedeveloperexceptionpage 中间件

与 asp.net core 中的大多数其他中间件组件一样,我们也可以自定义usedeveloperexceptionpage中间件。每当您想要自定义中间件组件时,请始终记住您可能拥有相应的options对象。那么,要自定义usedeveloperexceptionpage中间件,

developerexceptionpageoptions developerexceptionpageoptions = new developerexceptionpageoptions
{
    sourcecodelinecount = 10
};
app.usedeveloperexceptionpage(developerexceptionpageoptions);

sourcecodelinecount属性指定在导致异常的代码行之前和之后要包含的代码行数。

usedeveloperexceptionpage 中间件如何工作

usedeveloperexceptionpage中间件的位置尽可能的放置在其他中间件的位置前面,因为如果管道中的后面的中间件组件引发异常,它可以处理异常并显示developer exception页面。请参考以下代码:使用 run()注册的中间件后出现usedeveloperexceptionpage()中间件方法。因此,在这种情况下,将不会显示开发人员异常页面。这就是它必须尽早的放置在请求处理管道的原因。

public void configure(iapplicationbuilder app, ihostingenvironment env)
{
    //app.usefileserver();

    app.run(async (context) =>
    {
        throw new exception("some error processing the request");
        await context.response.writeasync("hello world!");
    });

    if (env.isdevelopment())
    {
        developerexceptionpageoptions developerexceptionpageoptions = new developerexceptionpageoptions
        {
            sourcecodelinecount = 10
        };
        app.usedeveloperexceptionpage(developerexceptionpageoptions);
    }
}

 

欢迎添加个人微信号:like若所思。

欢迎关注我的公众号,不仅为你推荐最新的博文,还有更多惊喜和资源在等着你!一起学习共同进步!