未在 ASP.NET 5 个应用上点击错误页面

Not hitting error page on ASP.NET 5 app

我正在玩一个新的 ASP.NET 5 MVC 6 应用程序。到目前为止,它是一个空的、开箱即用的应用程序 Visual Studio 在选择 ASP.NET 5 MVC 项目时创建。

在 Home 控制器操作中,我添加了一行以查看我是否会被重定向到一般错误页面,即 ~/Views/Shared/Error.cshtml

throw new UnauthorizedAccessException("Test exception!");

当我 运行 项目时,我得到的只是代码中的异常,但没有被重定向到错误页面。

以下是标准 Startup.cs -- 同样,开箱即用的代码。我还没有做任何更改。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    if (env.IsDevelopment())
    {
        app.UseBrowserLink();
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseIISPlatformHandler();

    app.UseStaticFiles();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

我不应该被重定向到错误页面吗?

听起来您是通过 DNX 通过 cmd 执行此操作,这会将 ASPNET_ENV 设置为 Production,而不是 Development.

我喜欢在启动时记录环境名称以帮助调试此类场景;

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();
    loggerFactory.CreateLogger("Startup")                     // add
        .LogInformation($"Startup: {env.EnvironmentName}");   // this

    ...
}

否则,您可以在 if (env.IsDevelopment()) 上放置一个断点,以确保您命中它。如果您 运行 VS2015 中的项目,它将 运行 作为 开发 ,但是,如果您 运行 在命令提示符下通过 DNX,您'需要将 ASPNET_ENV 环境变量设置为 Development

让我们解构有趣的部分(我删除了不相关的代码):

if (env.IsDevelopment()) 
{
    app.UseDeveloperExceptionPage();
}
else
{
    app.UseExceptionHandler("/Home/Error");
}

第一个是IsDevelopment()。 CLR 是怎么知道的?好吧...有一个名为 ASPNET_ENV 的环境变量,当您在 Visual Studio 中执行 F5 时会设置它。它会自动将其设置为 Development,然后它会向您显示一个非常好的堆栈跟踪,就像 <customErrors mode="Off"/> 过去那样。

如果您 运行 从您所说的基本命令行执行此操作会怎样?好吧,默认值将是 Production(或者 !IsDevelopment(),如果你愿意的话),突然 UseExceptionHandler(...) 将被使用。

正是在那一刻发生重定向。

结论

Visual Studio 将 运行 您的应用程序自动进入 Development 模式。

运行 独立应用程序将默认为 Production

您可以通过在环境变量中设置 ASPNET_ENV 来重新定义该值。它可以是任何东西,唯一会影响此代码的值是 Development.

这绝不是实现此目的的推荐方法,但您可以使用:

     if (app.WebRootPath.Contains("Development"))
        {
            app.UseBrowserLink();
            app.UseDeveloperExceptionPage();
        }
        else
        {
             app.UseExceptionHandler("/Home/Error");
        }

这会检查您存储 Web 应用程序的文件路径中的单词 'Development' 并相应地应用设置,您可以使用方法强制更改环境(只要设置了 Web 根目录正确)。

更多信息,看这个link:

https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/ 还有这个: http://docs.asp.net/en/latest/fundamentals/environments.html

RC2 正在改变有关部署和托管的一些基本内容,因此在您走得更远之前可能值得现在阅读它们?