【问题标题】:Not hitting error page on ASP.NET 5 app没有在 ASP.NET 5 应用程序上点击错误页面
【发布时间】:2015-12-17 04:35:18
【问题描述】:

我正在使用一个新的 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?}");
    });
}

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

【问题讨论】:

  • 您在哪里运行您的应用程序?在开发人员环境或其他环境中?
  • 当我转到属性并选择调试时,它当前显示“开发”

标签: c# asp.net-core asp.net-core-mvc


【解决方案1】:

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

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

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

如果你从你所说的基本命令行运行它会发生什么?那么默认值将是Production(或!IsDevelopment(),如果你愿意),然后突然UseExceptionHandler(...)将被使用。

就是在那个时候发生重定向。

结论

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

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

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

【讨论】:

    【解决方案2】:

    听起来您是通过 cmd 通过 DNX 执行此操作,这会将 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 中运行该项目,它将作为 Development 运行,但是,如果您在命令提示符下通过 DNX 运行它,则需要将 ASPNET_ENV 环境变量设置为 发展

    【讨论】:

      【解决方案3】:

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

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

      这会检查您存储 Web 应用程序的文件路径是否包含“开发”一词,并相应地应用设置,您可以使用方法强制更改环境(只要您的 Web 根设置正确)。

      更多信息,请查看此链接:

      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 正在改变有关部署和托管的一些基本内容,因此现在可能值得在您走得很远之前阅读它们?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-05
        • 2017-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-22
        • 1970-01-01
        • 2014-01-03
        相关资源
        最近更新 更多