没有在ASP.NET 5应用程序上遇到错误页面

时间:2015-12-17 04:35:19

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

如果从您说的基本命令行运行此操作会发生什么?如果您愿意,默认值为Production(或!IsDevelopment()),并且会突然使用UseExceptionHandler(...)

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

结论

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

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

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

答案 1 :(得分:0)

听起来您通过cmd通过DNX执行此操作,这会将ASPNET_ENV设置为生产,而不是开发

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

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环境变量开发

答案 2 :(得分:0)

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

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

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

更多信息,请看这个链接:

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正在改变有关部署和托管的一些基本要素,所以现在可能值得阅读它们,然后才能让自己走上一条道路?