设置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中configurationcustomErrors
和httpError
节点。
<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
进一步调查显示我有错误的方法 – 详细的信息不是默认的,但也许他们已经被打开,在你的盒子上,如果你看到你提到的不同的错误信息。
- 具有CultureInfo的DateTime.Now.DayOfWeek.ToString()
- 如果ModelState.IsValid失败,获取错误消息?
- 无法加载文件或程序集“System.Net.Http.Formatting”或其依赖项之一。 该系统找不到指定的path
- 如何让ASP.NET访问证书存储中的证书中的私钥?
- 从ASP.NET MVC操作发送HTTP 404响应的正确方法是什么?
- ASP.NET Core 1.0(ASP.NET 5 / vNext)计划何时发布?
- 在asp.net强制https整个网站的最佳途径?
- ASP.NET MVC如何禁用自动caching选项?
- Request.RawUrl与Request.Url