customErrors和httpErrors有什么区别?


168

ASP.NET MVC应用程序中的web.config文件的customErrorshttpErrors部分之间有什么区别?

每个部分的使用准则是什么?


1
恕我直言-HttpError是IIS级别的错误消息处理,而CustomError是ASP.Net的Web应用程序错误处理。但想知道更多...
阳光明媚

Answers:


85

免责声明:这是根据我的经验,不是事实。

两者都用于定义网站的错误处理,但是不同的软件引用不同的配置元素。

customErrors 是Visual Studio Development Server(又称VSDS或Cassini)使用的旧版(向后兼容)元素。

httpErrors 是仅由IIS7使用的新元素。

这突出了可能在使用VSDS而不是本地IIS的同时开发ASP.NET网站时问题。

另外,请自己参考这篇文章如果您希望完全控制错误输出了解如何使用IIS7处理错误消息。

摘要:

  • 发展中 VSDS使用中customErrors
  • 发布网站以IIS6供使用customErrors
  • 发布网站以IIS7供使用httpErrors

如果您使用开发VSDS但发布到IIS7,那么我想您会同时需要两者。


30
customErrors适用于asp.net。httpError适用于IIS7,因此可以处理未通过.net处理程序的内容(例如.png,.js等)。如果您想要非.net内容类型的错误页面,请使用IIS错误页面(针对IIS7的httpErrors ,即IIS6的用户界面。)
zcrar70,2011年

4
我建议安装IIS 7 Express并将其与Visual Studio一起使用以进行调试。与Cassini不同,它将使用与常规IIS 7相同的配置选项。
肖恩

不再需要使用@johnB的customErrors。 还有必要吗? 1.) 启用“ ASP”部分下的“将错误发送到浏览器”。 2.) 在“错误页面/编辑功能设置”下的“ 调试属性”中,选择“详细错误”。3.) 禁用“显示友好HTTP错误消息”在IE stackoverflow.com/questions/2640526/...
Kiquenet

136

* 2016年4月更新

当.net代码引发异常(404、403、500等)时,将使用customErrors属性,而在IIS本身引发异常时,将使用httpErrors属性。

  • / myfakeextensionslessurl-> httpErrors 404
  • /myfakeaspsx.aspx-> customErrors 404
  • /myfakeimage.jpg-> httpErrors 404
  • /throw500.apx-> customErrors 500
  • / throw500-> customErrors 500

尝试正确配置此配置有很多陷阱。因此,如果您正在寻找一个简单的例子,那么最好的2种选择是:

示例1:使用html页面

<system.web>
  <customErrors mode="RemoteOnly" defaultRedirect="/Error500.html" redirectMode="ResponseRewrite">
    <error statusCode="403" redirect="/Error403.html" />
    <error statusCode="404" redirect="/Error404.html" />
    <error statusCode="500" redirect="/Error500.html" />
  </customErrors>
</system.web>
<system.webServer>
  <httpErrors errorMode="DetailedLocalOnly" existingResponse="Auto">
    <remove statusCode="403" />
    <remove statusCode="404" />
    <remove statusCode="500" />
    <error statusCode="403" responseMode="File" path="Error403.html" />
    <error statusCode="404" responseMode="File" path="Error404.html" />
    <error statusCode="500" responseMode="File" path="Error500.html" />
  </httpErrors>
</system.webServer>

示例2:使用aspx页面

<system.web>
  <customErrors mode="RemoteOnly" defaultRedirect="/Error500.html" redirectMode="ResponseRewrite">
    <error statusCode="403" redirect="/Error403.aspx" />
    <error statusCode="404" redirect="/Error404.aspx" />
    <error statusCode="500" redirect="/Error500.aspx" />
  </customErrors>
</system.web>
<system.webServer>
  <httpErrors errorMode="DetailedLocalOnly" existingResponse="Auto">
    <remove statusCode="403" />
    <remove statusCode="404" />
    <remove statusCode="500" />
    <error statusCode="403" responseMode="ExecuteURL" path="Error403.aspx" />
    <error statusCode="404" responseMode="ExecuteURL" path="Error404.aspx" />
    <error statusCode="500" responseMode="ExecuteURL" path="Error500.aspx" />
  </httpErrors>
</system.webServer>

在aspx错误页面中,您需要执行以下操作(示例404页面):

<% 
    Response.StatusCode = 404;
    Response.TrySkipIisCustomErrors = true;
 %>

注意:在customErrors部分中不能使用扩展名较少的url (没有黑客)

一种解决方法是禁用自定义错误,并让http错误处理自定义页面。一个朋友创建了这样的设置,当我发现一段时间后,我将共享代码。

背景

一个好的自定义错误页面将:

  1. 在本地访问问题页面时显示真正的异常
  2. 远程访问问题页面时显示自定义页面
  3. 将不会重定向,而仅显示错误页面内容(由于seo原因)
  4. 将显示正确的状态码

因此,要澄清我们配置中的一些选项:

  1. <customErrors mode="RemoteOnly"。您可以指定在这里:OnOffRemoteOnly

    • On =始终显示自定义错误页面
    • Off =始终显示真实错误
    • RemoteOnly=在本地显示错误,但在远程显示自定义错误页面。所以我们要RemoteOnly声明1
  2. <customErrors redirectMode="ResponseRewrite"。您可以在此处指定:ResponseRedirectResponseRewrite。该ResponseRedirect模式会将错误页面重定向到自定义错误页面。对于链接搜寻器(SEO),这将导致302-> 500,但是您希望链接搜寻器出现500错误。

  3. <httpErrors errorMode="DetailedLocalOnly"。这相当于该customErrors模式。选择您有:CustomDetailedDetailedLocalOnly

一个对我有很大帮助的好博客文章是:http : //benfoster.io/blog/aspnet-mvc-custom-error-pages


什么样的关系customErrors-httpErrors和IIS配置,例如ASP中的“将错误发送到浏览器”-调试属性“错误页面/编辑功能设置”,“详细错误”。stackoverflow.com/questions/2640526/...
Kiquenet

36

<customErrors><httpErrors>


<customErrors>

  • 在IIS7 +中仍然可用
  • 为ASP.NET处理的请求指定自定义错误页面
  • 仅处理ASP.NET应用程序中的请求
  • 无法处理HTML文件或目录(“友好”)URL之类的静态文件

<httpErrors>

  • 在IIS7中引入
  • 为IIS处理的请求指定自定义错误页面
  • 处理ASP.NET应用程序内的请求和/或处理ASP.NET应用程序外的请求*
  • 所有文件和URL均已处理*

注意:不再需要使用 customErrors

引用源:ASP.NET中的自定义404和错误页面(优秀文章)


ExecuteURL提供动态内容,例如.aspx页面(该path值必须是服务器相对URL):

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL" >
    <remove statusCode="404"/>
    <error statusCode="404" responseMode="ExecuteURL" path="/error.aspx" />
  </httpErrors>
</system.webServer>

File 提供自定义错误文件,例如.html页面:

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="File" >
    <remove statusCode="404"/>
    <error statusCode="404" path="404.html" />
  </httpErrors>
</system.webServer>

参考:HTTP错误(www.iis.net)

有关更多详细信息,请阅读上面的www.iis.net链接


也许有用** stackoverflow.com/ questions/2640526/… **如果将httpError“将错误发送到浏览器”错误页面结合使用
Kiquenet

3
+1和注释it's no loger necesary to use customErrors,这确实是我所追求的信息:-)
Myster

4

Web配置中的错误部分用于提供自定义http错误处理方法,有两个部分,一个在system.web部分内部,一个customErrors,另一个在system.webServer部分内部,httpError,如下所示。

customErrors: 在引入IIS 7之前,IIS 6 5之前以及在根据HTTP状态代码完全使用此部分来处理自定义HTTP错误之前,都在使用此部分。

httpErrors: IIS 7和更高版本使用IIS 7和更高版本,并使用customErrors部分根据文件扩展名处理自定义http错误(如果请求的页面扩展名注册有ISAPI dll(.aspx,ashx,.asmx,.svc等),则为index.aspx) IIS从customeErrors部分中选取设置,否则从httpErrors中选取设置(IIS 7托管模式必须设置为集成心情,而不是经典风格

以下是针对404错误处理检查链接的示例:

webconfig,iis,asp.net中的httperrors与customerrors

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.