99

这里有一个奇怪的问题。每个人都知道,如果您使用 web.config 的customErrors部分来制作自定义错误页面,您应该将您Response.StatusCode的设置为适当的。例如,如果我创建一个自定义 404 页面并将其命名为 404.aspx,我可以<% Response.StatusCode = 404 %>输入内容以使其具有真正的 404 状态标题。

一直跟着我?好的。现在尝试在 IIS7 上执行此操作。我无法让它工作,期间。如果Response.StatusCode在自定义错误页面中设置,IIS7 似乎会完全覆盖自定义错误页面,并显示自己的状态页面(如果您配置了一个。)

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

注意:这与ASP.NET Custom 404 Returning 200 OK 而不是 404 Not Found中的问题不同

4

7 回答 7

117

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

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

existingResponse 属性的默认值为 Auto:

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

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

于 2009-03-31T20:07:21.467 回答
82

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

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

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

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

于 2009-05-01T22:34:45.503 回答
11

已解决:事实证明,需要打开“详细错误”才能让 IIS7“通过”您可能拥有的任何错误页面。见http://forums.iis.net/t/1146653.aspx

于 2009-01-12T09:41:07.387 回答
4

我不确定这在本质上是否相似,但我解决了一个表面上听起来相似的问题,这就是我处理它的方法。

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

从 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 状态代码,除非它实际上是一个死页。

无论如何,我就是这样做的。希望对某人有所帮助。

于 2013-07-31T12:44:48.700 回答
3

这个问题一直很头疼。前面提到的任何建议都没有单独为我解决,所以我将我的解决方案包括在内。作为记录,我们的环境/平台使用:

  • .NET 框架 4
  • MVC 3
  • IIS8(工作站)和 IIS7(网络服务器)

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

首先,我的代码必须抛出一个HttpException. 从控制器返回 aNotFoundResult并没有达到我想要的结果。

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

然后我必须在 Web.config 中配置和节点customErrorshttpError

<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>

请注意,我留下了existingResponseas Auto,这与 @sefl 提供的解决方案不同。

这些customErrors设置似乎对于处理我的显式抛出是必要的HttpException,而httpErrors节点处理的 URL 超出了 Globals.asax.cs 中指定的路由模式。

PS有了这些设置我不需要设置Response.TrySkipIisCustomErrors

于 2014-02-26T19:34:48.923 回答
2

TrySkipIisCustomErrors只是谜题的一部分。如果您使用自定义错误页面,但您还想提供一些基于 4xx 状态的 RESTful 内容,那么您就有问题了。将 web.config 的 httpErrors.existingResponse 设置为“Auto”不起作用,因为 .net 似乎总是向 IIS 提供一些页面内容,因此使用“Auto”会导致所有(或至少一些)自定义错误页面不被使用。使用“替换”也不起作用,因为响应将包含您的 http 状态代码,但其内容将为空或填充自定义错误页面。而“PassThrough”实际上会关闭 CEP,因此无法使用。

因此,如果您想在某些情况下绕过 CEP(绕过我的意思是返回带有某些内容的状态 4xx),您将需要额外的步骤:清除错误:

void Application_Error(object sender, EventArgs e)
{
    var httpException = Context.Server.GetLastError() as HttpException;
    var statusCode = httpException != null ? httpException.GetHttpCode() : (int)HttpStatusCode.InternalServerError;

    Context.Server.ClearError();
    Context.Response.StatusCode = statusCode;
}

因此,如果您想使用 REST 响应(即 400 - 错误请求)并使用它发送一些内容,您只需在 web.config 的 httpErrors 部分中设置TrySkipIisCustomErrors某个操作并设置existingResponse为“自动”。现在:

  • 当没有错误(动作返回 4xx 或 5xx)并且返回了一些内容时,不使用 CEP 并将内容传递给客户端;
  • 当出现错误(抛出异常)时,错误处理程序返回的内容将被删除,因此使用 CEP。

如果您想从您的操作返回带有空内容的状态,它将被视为空响应并显示 CEP,因此还有一些改进此代码的空间。

于 2017-12-27T22:01:52.017 回答
0

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

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

此处提供更多信息:http: //blogs.iis.net/rakkimk/archive/2008/10/03/iis7-enabling-custom-error-pages.aspx

进一步的调查显示我有错误的方法 - 默认情况下不是详细消息,但如果您看到您提到的不同错误消息,它们可能已在您的盒子上打开。

于 2009-01-12T02:53:21.967 回答