Asp.net mvc 在生产环境中显示developerCeptionPage,但用于';“仅远程”;
我理解最终用户不应该看到调试错误页面 然而,在过去,我总是能够配置我的生产部署,以便在远程调用时隐藏此信息(因此显示自定义或通用错误页),但仍然显示异常/stacktrace调试错误,只要我直接从承载它的Web服务器调用它 现在看看最新的MVC/RazorPages方式,是不是这种情况不再可能了,它是开还是关,取决于环境变量 之前: 在Web.Config中,我可以执行以下操作:Asp.net mvc 在生产环境中显示developerCeptionPage,但用于';“仅远程”;,asp.net-mvc,razor-pages,Asp.net Mvc,Razor Pages,我理解最终用户不应该看到调试错误页面 然而,在过去,我总是能够配置我的生产部署,以便在远程调用时隐藏此信息(因此显示自定义或通用错误页),但仍然显示异常/stacktrace调试错误,只要我直接从承载它的Web服务器调用它 现在看看最新的MVC/RazorPages方式,是不是这种情况不再可能了,它是开还是关,取决于环境变量 之前: 在Web.Config中,我可以执行以下操作: <system.web> <customErrors mode="RemoteOnly" <
<system.web>
<customErrors mode="RemoteOnly" </customErrors>
。。。但是当env.isDevelopement==false时,我看不到允许“app.usedeveloperceptionpage();”的方法,但是调用是本地的
我希望我遗漏了一些东西,而不是现在已经删除的东西。您可以使用Url.IsLocalUrl扩展或创建自己的副本,只在localhost上显示错误视图。我让它工作起来了(这一切都要感谢这里的其他人)。希望它能帮助其他人在一个地方看到我需要的信息
首先确定呼叫是否为本地呼叫:
至于:
Url.IsLocalUrl
据推测这是可行的,但这是一个“恶作剧”。考虑到它可能会泄露源代码/调试,本页()上的人建议如下:
public static class HttpContextFilters
{
public static bool IsLocalRequest(HttpContext context)
{
if (context.Connection.RemoteIpAddress.Equals(context.Connection.LocalIpAddress))
{
return true;
}
if (IPAddress.IsLoopback(context.Connection.RemoteIpAddress))
{
return true;
}
return false;
}
public static bool IsRemoteRequest(HttpContext context)
{
return !IsLocalRequest(context);
}
}
我现在可以打电话给p.C
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseWhen(HttpContextFilters.IsLocalRequest, configuration => configuration.UseDeveloperExceptionPage());
app.UseWhen(HttpContextFilters.IsRemoteRequest, configuration => configuration.UseExceptionHandler("/Error"));
}
对于另一种解决方案,我怀疑@Jon Galloway的方法会产生一个更优雅、更可扩展的解决方案
大致如下:
public class MyDeveloperExceptionPageMiddleware : Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware
{
private readonly RequestDelegate _next;
public MyDeveloperExceptionPageMiddleware(RequestDelegate next,
IOptions<DeveloperExceptionPageOptions> options,
ILoggerFactory loggerFactory,
IHostingEnvironment hostingEnvironment,
DiagnosticSource diagnosticSource) : base(next, options, loggerFactory, hostingEnvironment, diagnosticSource)
{
_next = next;
}
public async new Task Invoke(HttpContext httpContext)
{
if (HttpContextFilters.IsLocalRequest(httpContext))
{
//Show dev exceptions page
await base.Invoke(httpContext);
return;
}
await _next(httpContext);
return;
}
public static class MyDeveloperExceptionPageMiddlewareExtensions
{
public static IApplicationBuilder UseMyDeveloperExceptionPageMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<MyDeveloperExceptionPageMiddleware>();
}
}
但出于某种原因(由于我的无能),我不能让VS喜欢调试它,但在从web服务器运行时似乎可以工作。然而,对于我所需要的,并且考虑到处理自定义错误页面需要完成这一事实,我认为上面的简化和肮脏的方法对我来说已经足够了
public class MyDeveloperExceptionPageMiddleware : Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware
{
private readonly RequestDelegate _next;
public MyDeveloperExceptionPageMiddleware(RequestDelegate next,
IOptions<DeveloperExceptionPageOptions> options,
ILoggerFactory loggerFactory,
IHostingEnvironment hostingEnvironment,
DiagnosticSource diagnosticSource) : base(next, options, loggerFactory, hostingEnvironment, diagnosticSource)
{
_next = next;
}
public async new Task Invoke(HttpContext httpContext)
{
if (HttpContextFilters.IsLocalRequest(httpContext))
{
//Show dev exceptions page
await base.Invoke(httpContext);
return;
}
await _next(httpContext);
return;
}
public static class MyDeveloperExceptionPageMiddlewareExtensions
{
public static IApplicationBuilder UseMyDeveloperExceptionPageMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<MyDeveloperExceptionPageMiddleware>();
}
}
app.UseMyDeveloperExceptionPageMiddleware();