customErrors和httpErrors有什么区别?

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

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

免责声明:这是从我的经验,没有certificate的事实。

两者都用于定义网站的error handling,但是不同的软件是指不同的configuration元素。

customErrors是Visual Studio Development Server(也就是VSDS或Cassini)使用的遗留(向后兼容)元素。

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

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

另外,如果您希望完全控制错误输出,请自行参考此文章,了解如何处理IIS7的错误消息。

概要:

  • VSDS开发 – 使用customErrors
  • 发布网站到IIS6 – 使用customErrors
  • 发布网站到IIS7 – 使用httpErrors

如果你用VSDS开发,但是发布到IIS7 ,那么我想你们俩都需要。

* 2016年4月更新

当.net代码抛出一个exception(404,403,500等)时使用customErrors属性,当IIS自身抛出exception时使用httpErrors属性。

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

有很多陷阱试图正确configuration。 所以,如果你正在寻找一个快速的例子,你有最好的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部分中使用扩展less的url是不可能的! (没有黑客)

解决办法之一是禁用自定义错误,并让httperror handling自定义页面。 一个朋友创build了这样的设置,当我find一些时候,我会分享代码。

背景

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

  1. 在本地访问问题页面时显示真正的exception
  2. 当您远程访问问题页面时显示自定义页面
  3. 不会redirect,而只是显示错误页面内容(因为seo的原因)
  4. 将显示正确的状态码

所以要澄清我们的configuration中的一些选项:

  1. customErrors mode =“RemoteOnly”。 你可以在这里指定:On,Off,RemoteOnly。 On =始终显示自定义错误页面,Off =始终显示实际错误,RemoteOnly =在本地显示错误,但远程显示自定义错误页面。 所以我们需要RemoteOnly语句1
  2. customeErrors redirectMode =“ResponseRewrite”。 你可以在这里设置:ResponseRedirect,ResponseRewrite。 模式ResponseRedirect将redirect错误页面到自定义错误页面。 对于链接爬虫(seo),这将导致302 – > 500.虽然你想链接爬虫得到一个简单的500错误。
  3. httpErrors errorMode =“DetailedLocalOnly”,这是customErrors模式的平等。 您拥有的选项:自定义,详细,DetailedLocalOnly

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

<customErrors><httpErrors>


<customErrors>

  • 仍然可以在IIS7 +中使用
  • 指定由ASP.NET处理的请求的自定义错误页面
  • 只处理ASP.NET应用程序中的请求
  • 静态文件,如HTML文件或目录(“友好”)的URL不处理

<httpErrors>

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

注意:不再需要使用customErrors

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


ExecuteURL提供dynamic内容,例如.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链接

在webconfiguration中的错误部分是提供自定义httperror handling方法有两个部分,system.web部分中的一个customErrors和system.webServer部分中的另一个httpErrors(如下所示)

customErrors:在IIS 7引入之前,IIS 6已经使用了这个部分,在根据http状态代码完全使用这个部分来处理自定义http错误之前。

httpErrors:如果请求的页面扩展名与ISAPI dll(.aspx,ashx,.asmx,.svc等)一起注册,比如index.aspx,那么IIS 7和更高版本使用这个部分以及customErrors部分来处理基于它们的文件扩展名的自定义http错误。 IIS从顾客的错误部分拿起设置其他它从httpErrors拿起设置(IIS 7托pipe模式必须设置为集成心情不经典)

下面是404error handling检查链接的例子:

在webconfig,iis,asp.net中的httperrors vs customerrors