我让它工作了(感谢这里的其他人)。希望它可以帮助其他人在一个地方看到我需要的部分。
首先确定呼叫是否是本地的:
至于:
Url.IsLocalUrl
据说它有效,但“可欺骗”。鉴于它可以揭示源代码/调试,此页面上的人 (In ASP.NET Core how do you check if request is local?) 建议更像:
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);
}
}
我现在可以调用 Statup.cs:
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>();
}
}
然后在 StartUp.cs 中执行:
app.UseMyDeveloperExceptionPageMiddleware();
尽管出于某种原因(由于我的无能),我无法让 VS 喜欢调试它,但在从 Web 服务器运行时似乎可以工作。但是,对于我所需要的,并且考虑到它需要完成处理自定义错误页面这一事实,我认为上面简化的向下和肮脏的方法对我来说已经足够了。