设置Response.StatusCode时IIS7重写customErrors?

这里有一个奇怪的问题。 大家都知道,如果你使用web.config的customErrors部分来创build一个自定义的错误页面,那么你应该设置你的Response.StatusCode为任何适当的。 例如,如果我创build一个自定义404页面并将其命名为404.aspx,则可以在内容中放置<% Response.StatusCode = 404 %> ,以使其具有一个真实的404状态标题。

跟我到目前为止? 好。 现在尝试在IIS7上执行此操作。 这段时间我无法工作。 如果Response.StatusCode在自定义错误页面中设置,IIS7似乎完全覆盖自定义错误页面,并显示自己的状态页面(如果您有一个configuration。)

有没有其他人看到这种行为,也可能知道如何解决它? 它在IIS6下工作,所以我不知道为什么事情会改变。

注意:这与ASP.NET自定义404返回200 OK中的问题不一样, 而不是找不到404

使行为一致的最简单方法是清除错误并使用Response.TrySkipIisCustomErrors并将其设置为true。 这将覆盖您的页面中的IIS全局错误页面处理或Application_Error中的全局error handling程序。

 Server.ClearError(); Response.TrySkipIisCustomErrors = true; 

通常,您应该在Application_Error处理程序中执行此操作,该处理程序处理您的应用程序error handling程序无法捕获的所有错误。

更详细的信息可以在这篇博客中find: http : //www.west-wind.com/weblog/posts/745738.aspx

在system.webServer / httpErrors部分中将existingResponse设置为PassThrough:

  <system.webServer> <httpErrors existingResponse="PassThrough" /> </system.webServer> 

existingResponse属性的默认值是Auto:

自动告诉自定义错误模块做正确的事情。 客户端看到的实际错误文本将受到IHttpResponse::GetStatus调用中返回的fTrySkipCustomErrors的值的影响。 当fTrySkipCustomErrors设置为true时,自定义错误模块会让响应通过,但如果设置为false,自定义错误模块将用自己的文本replace文本。

更多信息: 期望从IIS7自定义错误模块

解决:事实certificate,“详细的错误”需要开启,以便IIS7“传递”您可能拥有的任何错误页面。 请参阅http://forums.iis.net/t/1146653.aspx

我不确定这种情况在性质上是否相似,但是我解决了一个表面上听起来类似的问题,这就是我如何处理这个问题。

首先,对于我的情况,existingResponse(Auto)的默认值是正确的答案,因为我有一个自定义404,400和500(我可以创build其他人,但这三个就足够了我正在做的)。 以下是帮助我的相关部分。

从web.config:

 <customErrors mode="Off" /> 

 <httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL"> <clear /> <error statusCode="404" path="/errors/404.aspx" responseMode="ExecuteURL" /> <error statusCode="500" path="/errors/500.aspx" responseMode="ExecuteURL" /> <error statusCode="400" path="/errors/400.aspx" responseMode="ExecuteURL" /> </httpErrors> 

从那里,我把这个添加到global.asax的Application_Error:

  Response.TrySkipIisCustomErrors = True 

在我的每个自定义错误页面上,我都必须包含正确的响应状态码。 在我的情况下,我正在使用自定义404将用户发送到我的网站的不同部分,所以我想要一个404状态代码返回,除非它实际上是一个死页面。

无论如何,这就是我做到的。 希望能帮助别人。

这个问题一直令人头痛。 前面提到的build议没有一个能够解决它,所以我包括我的解决scheme。 为了logging,我们的环境/平台使用:

  • .NET Framework 4
  • MVC 3
  • IIS8(工作站)和IIS7(networking服务器)

具体来说,我试图得到一个HTTP 404响应,将用户redirect到我们的自定义404页面(通过Web.config设置)。

首先,我的代码必须抛出一个HttpException 。 从控制器返回一个NotFoundResult没有达到我以前的结果。

 throw new HttpException(404, "There is no class with that subject"); 

然后,我不得不在Web.config中configurationcustomErrorshttpError节点。

 <customErrors mode="On" defaultRedirect="/classes/Error.aspx"> <error statusCode="404" redirect="/classes/404.html" /> </customErrors> 

 <httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL"> <clear /> <error statusCode="404" path="/classes/404.aspx" responseMode="ExecuteURL" /> </httpErrors> 

请注意,我将existingResponse作为Auto ,这与提供的解决scheme@sefl不同。

customErrors设置似乎是处理我显式抛出的HttpException所必需的,而httpErrors节点处理的URL位于Globals.asax.cs中指定的路由模式之外。

附带这些设置我不需要设置Response.TrySkipIisCustomErrors

默认情况下IIS 7使用详细的自定义错误消息,所以我会假设Response.StatusCode将等于404.XX,而不仅仅是404。

您可以将IIS7configuration为使用更简单的错误消息代码,或者修改处理IIS7提供的更详细的错误消息的代码。

更多信息请访问: http : //blogs.iis.net/rakkimk/archive/2008/10/03/iis7-enabling-custom-error-pages.aspx

进一步调查显示我有错误的方法 – 详细的信息不是默认的,但也许他们已经被打开,在你的盒子上,如果你看到你提到的不同的错误信息。