在我们的asp.net网页(.net 4.7.2)中,我们使用自定义异常呈现逻辑,它通过以下方式为global.asax.cs中的用户创建特定的错误页面:
Application_Error(object sender, EventArgs e)这个很好用。但是,有一些asp.net错误从未击中Application_Error-event。
对于这些错误,我们通过web.config中的customErrors-element显式设置一个错误页。这个看起来是这样的:
<customErrors mode="On" defaultRedirect="~/CustomErrors/FatalError.aspx" redirectMode="ResponseRewrite" />问题
在大多数情况下,上述方法都很好。但是,有一些asp.net错误,这些错误不是由Application_Error事件处理的,也会导致FatalError.aspx抛出异常,即使其中没有asp-代码。这种错误的一个很好的例子是,当您在浏览器中键入以下预留地址时:
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本身。然而,我们没有注意到对上述问题有任何依赖,因此,我在主要案文中没有提到这一点。
发布于 2021-03-19 17:40:08
错误不是从Application_Error传递来的。您可以在此会话上在web.config上配置此错误。
这里有一个示例来传递未找到的页面,它意味着大多数没有通过Application_Error的错误。
403错误是针对FOR投标人错误的。
<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
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");
}
}当你写的时候也用
<customErrors mode="On" defaultRedirect="~/error.aspx" redirectMode="ResponseRewrite">COM1-9、LPT1 1-9、AUX、PRT、NUL、CON文件是假宗,可以在IIS上使用此选项避免使用该选项。
<configuration>
<system.web>
<httpRuntime relaxedUrlToFileSystemMapping="true" ....other settings.... />
</system.web>
</configuration>通过设置此选项,您将在asp.net下再次获得该文件--但是--我不会建议这样做,因为这些请求不是来自您的系统的常规使用,如果您将其设置为true,则可能不是不受保护。
web与viewStateKey
对于web forms,我检查错误的另一点是viewStateKey post值-有关更多细节,您可以阅读这个q/a:
发布于 2021-03-27 06:14:37
<system.web>
<customErrors mode=”On” redirectMode=”ResponseRewrite”>
<error statusCode=”500″ redirect=”~/errorpages/500.aspx” />
</customErrors>
</system.web>https://stackoverflow.com/questions/66712526
复制相似问题