gpt4 book ai didi

c# - ASP.NET MVC 自定义错误

转载 作者:IT王子 更新时间:2023-10-29 04:37:51 24 4
gpt4 key购买 nike

我的目标是在应用程序中创建一个错误处理程序来处理所有托管错误,而不仅仅是与 MVC 相关的错误。所以我没有使用 HandleErrorAttribute 模式,因为它只针对 MVC 错误,而不是其他托管错误。

在我的 Global.asax 中我有:

protected void Application_Error()
{
string displayError = ConfigurationManager.AppSettings["DisplayError"];
NameValueCollection serverVariables;
int loop1, loop2;
StringBuilder serverVariableKeys = new StringBuilder();
Exception exception = Server.GetLastError();
HttpException httpException = exception as HttpException;

if (HttpContext.Current != null)
{
// loop through and get server vars
}

if (exception != null)
// Log Error

// Redirect to Error page if set to basic mode
if (!string.IsNullOrWhiteSpace(displayError) && displayError.ToLower() == "basic")
{
Response.Clear();
Server.ClearError(); // needed for redirect to work

var routeData = new RouteData();
routeData.Values["controller"] = "Error";
routeData.Values["action"] = "General";
routeData.Values["exception"] = exception;
Response.StatusCode = 500;

if (httpException != null)
{
Response.StatusCode = httpException.GetHttpCode();
switch (Response.StatusCode)
{
case 403:
routeData.Values["action"] = "Http403";
break;
case 404:
routeData.Values["action"] = "Http404";
break;
}
}

IController errorsController = new Controllers.ErrorController();
var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
errorsController.Execute(rc);
}
}

我有一个 ErrorControllerGeneral , Http403Http404行动。我有对应于每个 Action 的 View 。

在我的 web.config 中我有:

  <system.web>  
<!-- removed bits to reduce space -->
<customErrors mode="On" />
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules >
<remove name="UrlRoutingModule-4.0" />
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
<remove name="Session"/>
<add name="Session" type="System.Web.SessionState.SessionStateModule" preCondition=""/>
</modules>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<httpErrors errorMode="Detailed" />
</system.webServer>

这适用于许多与托管代码相关的场景,但当 IIS 接管时,例如错误的静态文件调用 (example.com/BadFileName.gif),它将从 IIS 返回一个错误,该错误会泄露服务器详细信息,例如本地文件路径.这是因为 web.config 中的以下行:

<httpErrors errorMode="Detailed" />

但是,当我将 errorMode 设置为其他值(如自定义)或只是删除该行时,我的自定义错误处理将停止运行,并且会为包括托管代码错误在内的所有内容返回默认的 IIS 错误消息。

我已经尝试了很多方法来使自定义错误在没有此设置的情况下正常工作,但没有任何运气,包括:

  • 设置CustomErrormode="Off"
  • customError 下定义错误节点重定向到我的 Controller
  • httpErrors 下定义错误节点重定向到我的 Controller

当我逐步调试时,我可以看到对 Controller 的调用,但最后 IIS 发送了响应。错误日志记录确实被正确调用了 Application_Error,因此代码确实让应用程序将其处理到某个点。

申请详情:

  • ASP.NET MVC 4.0
  • 托管在 IIS 7.5(Azure 网站预览)上

有没有办法不使用 <httpErrors errorMode="Detailed" />并让这个工作?

最佳答案

您看到该行为的原因可能是您的 Application_Error 处理程序被正确调用(并调用您的 Controller ),但随后 IIS 拦截了 500 错误并显示了它自己的错误页面。 (尽管您的 Application_Error 处理程序本身也可能抛出一个 Exception,但您需要排除这种情况)

因为您想处理所有错误(例如您提到的静态文件错误),您可能无法依赖 ASP.NET 或 ASP.NET MVC 为您进行初始错误检测。 并非所有错误都来自您的应用程序!

最好的办法是尽可能多地依靠 IIS 7.5 的错误处理,而不是过早地尝试自己介入。让 IIS 为您进行初始错误检测,这会容易得多。

尝试将以下内容放入您的 web.config 中,替换您现有的 httpErrors 节点:-

<httpErrors errorMode="Custom" existingResponse="Replace">
<clear />
<error statusCode="400" responseMode="ExecuteURL" path="/Error" />
<error statusCode="403" responseMode="ExecuteURL" path="/Error/Forbidden" />
<error statusCode="404" responseMode="ExecuteURL" path="/Error/NotFound" />
<error statusCode="500" responseMode="ExecuteURL" path="/Error" />
</httpErrors>

完全删除 customErrors 节点。这是不必要的。

记住并确保你的错误 Controller 设置了正确的状态代码:-

public ActionResult Forbidden()
{
Response.StatusCode = 403;
return this.View();
}

然后您应该能够放弃除注销您的 Application_Error 处理程序之外的所有内容 - 尽管我认为您最好创建自己的 HttpModule;在 web.config 中的模块节点上设置 runAllManagedModulesForAllRequests 可帮助您捕获否则会漏掉的错误。

我已经在 Azure 网站预览版上运行了这个设置(尽管我个人使用 elmah 进行日志记录),它捕获了所有内容,除了显然由于未能解析 web.配置.

我放了一个 full working example of using httpErrors for custom error pages up on github .您也可以see it live on azure web sites .

关于c# - ASP.NET MVC 自定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14532039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com