首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确设置ASP.NET web.config以在边缘情况下显示特定应用程序、安全和用户友好的asp.net错误消息

如何正确设置ASP.NET web.config以在边缘情况下显示特定应用程序、安全和用户友好的asp.net错误消息
EN

Stack Overflow用户
提问于 2021-03-19 17:01:40
回答 2查看 932关注 0票数 3

在我们的asp.net网页(.net 4.7.2)中,我们使用自定义异常呈现逻辑,它通过以下方式为global.asax.cs中的用户创建特定的错误页面:

代码语言:javascript
复制
Application_Error(object sender, EventArgs e)

这个很好用。但是,有一些asp.net错误从未击中Application_Error-event。

对于这些错误,我们通过web.config中的customErrors-element显式设置一个错误页。这个看起来是这样的:

代码语言:javascript
复制
<customErrors mode="On" defaultRedirect="~/CustomErrors/FatalError.aspx" redirectMode="ResponseRewrite"  />

问题

在大多数情况下,上述方法都很好。但是,有一些asp.net错误,这些错误不是由Application_Error事件处理的,也会导致FatalError.aspx抛出异常,即使其中没有asp-代码。这种错误的一个很好的例子是,当您在浏览器中键入以下预留地址时:

代码语言:javascript
复制
https://[yourWebsite]/com1

这会打击基于..aspx的默认错误页,其中包含以下错误消息(Http-Status-Code 500):

在处理请求时发生异常。此外,在为第一个异常执行自定义错误页时发生了另一个异常。请求已被终止。

即使设置一个完全没有asp代码的aspx文件,也会导致此错误.如果将defaultRedirect-attribute配置为不存在的资源,也会发生同样的情况!如果在error-element下定义了明确的customErrors-element,则这也没有任何区别,后者定义了基于显式http statusCode的重定向资源。

当将redirectMode of customErrors-element设置为ResponseRedirect时,基于aspx的默认错误处理程序工作良好。但是,这不是选项,因为我们的客户不希望看到重定向。

作为解决办法,我们可以尝试使用静态html文件。但是,在这种情况下,asp.net在没有正确内容类型的情况下将响应发送回浏览器,并且HTML被呈现为文本。

在整个互联网上有很多帖子说这是个错误。但是,建议的解决方案总是要么使用..aspx文件,要么使用global.asax.cs中的global.asax.cs事件在代码中手动设置内容类型。但是,在这种情况下,这两种变体都不可能像上面所描述的那样(每个aspx文件的打击和Application_Error都不会被调用)。

问题

我们如何配置可靠的错误处理,它从不显示任何asp.net特定的错误信息,而是应用程序特定的错误信息,即使在本文中描述的边缘情况下也是如此。

请注意,问题不在于如何使用保留的资源名来避免错误。这只是一个例子,而且可能还有更多的其他情况,其中发生asp.net错误,这些错误永远不会到达Application_Error事件并将基于aspx的错误文件删除。目标实际上是有一种机制来呈现应用程序的错误消息,而不是完全可靠的asp.net错误消息。

另外,作为一个侧节点,我们还使用webServer-节中的httpErrors元素来更改错误,这些错误不是来自asp.net,而是来自IIS本身。然而,我们没有注意到对上述问题有任何依赖,因此,我在主要案文中没有提到这一点。

EN

回答 2

Stack Overflow用户

发布于 2021-03-19 17:40:08

错误不是从Application_Error传递来的。您可以在此会话上在web.config上配置此错误。

这里有一个示例来传递未找到的页面,它意味着大多数没有通过Application_Error的错误。

403错误是针对FOR投标人错误的。

代码语言:javascript
复制
<system.webServer>
    <httpErrors>
      <remove statusCode="404" subStatusCode="-1" />
      <remove statusCode="403" subStatusCode="-1" />      
      <error statusCode="404" prefixLanguageFilePath="" path="/PageNotFound.aspx" responseMode="ExecuteURL" />
      <error statusCode="403" prefixLanguageFilePath="" path="/PageNotFound.aspx" responseMode="ExecuteURL" />        
     </httpErrors>
</system.webServer>

如何在Application_Error上使用global.asax

代码语言:javascript
复制
void Application_Error(object sender, EventArgs e)
{
    // log the last error
    Exception LastOneError = Server.GetLastError();

    string cTheFile = HttpContext.Current.Request.Path;

    if (!cTheFile.EndsWith("PageNotFound.aspx", StringComparison.InvariantCultureIgnoreCase))
    {
        // check for this above -> fPageNotExist
        // reference: https://stackoverflow.com/a/14032497/159270
        if(fPageNotExist)
            Response.Redirect("~/PageNotFound.aspx");
        else
            Server.Transfer("~/PageNotFound.aspx");
    }
}

当你写的时候也用

代码语言:javascript
复制
<customErrors mode="On" defaultRedirect="~/error.aspx" redirectMode="ResponseRewrite">

COM1-9、LPT1 1-9、AUX、PRT、NUL、CON文件是假宗,可以在IIS上使用此选项避免使用该选项。

代码语言:javascript
复制
<configuration>
  <system.web>
    <httpRuntime relaxedUrlToFileSystemMapping="true"   ....other settings.... />

   </system.web>
</configuration>

通过设置此选项,您将在asp.net下再次获得该文件--但是--我不会建议这样做,因为这些请求不是来自您的系统的常规使用,如果您将其设置为true,则可能不是不受保护

web与viewStateKey

对于web forms,我检查错误的另一点是viewStateKey post值-有关更多细节,您可以阅读这个q/a:

CryptographicException:填充无效,无法删除,而且viewstate验证失败

票数 1
EN

Stack Overflow用户

发布于 2021-03-27 06:14:37

代码语言:javascript
复制
<system.web>
<customErrors mode=”On” redirectMode=”ResponseRewrite”>
<error statusCode=”500″ redirect=”~/errorpages/500.aspx” />
</customErrors>
</system.web>
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66712526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档