【问题标题】:Show DeveloperExceptionPage in production but for 'Remote Only"在生产中显示 DeveloperExceptionPage 但仅用于“远程”
【发布时间】:2019-08-14 08:48:42
【问题描述】:

我了解最终用户不应看到调试错误页面。

但是在过去,我一直能够将我的生产部署配置为在远程调用时隐藏此信息(因此显示自定义或通用错误页面),但仍然显示异常/堆栈跟踪调试错误,只要我直接从托管它的网络服务器调用它。

现在看最新的MVC/RazorPages方式,是不是这种情况不再可能了,是开还是关,取决于环境变量?

之前:

在 Web.Config 中,我曾经能够执行以下操作:

<system.web>
<customErrors mode="RemoteOnly" </customErrors>

现在:

在 Startup.cs 中:

我可以看到

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

...但我看不到允许“app.UseDeveloperExceptionPage();”的方法当 env.isDevelopement == false,但调用是本地的。

我希望我遗漏了一些东西,而不是现在已经被删除的东西。

【问题讨论】:

    标签: asp.net-mvc razor-pages


    【解决方案1】:

    您可以扩展 DeveloperExceptionPageMiddleware,或创建自己的副本,使用 Url.IsLocalUrl 仅在 localhost 上显示错误视图。

    【讨论】:

      【解决方案2】:

      我让它工作了(感谢这里的其他人)。希望它可以帮助其他人在一个地方看到我需要的部分。

      首先确定呼叫是否是本地的:

      至于:

      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 服务器运行时似乎可以工作。但是,对于我所需要的,并且考虑到它需要完成处理自定义错误页面这一事实,我认为上面简化的向下和肮脏的方法对我来说已经足够了。

      【讨论】:

        猜你喜欢
        • 2017-11-08
        • 2019-05-13
        • 1970-01-01
        • 1970-01-01
        • 2022-10-20
        • 1970-01-01
        • 1970-01-01
        • 2016-11-01
        • 1970-01-01
        相关资源
        最近更新 更多