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