31

所以我从我的 MVC Web 应用程序返回详细的 400 错误响应。设置 existingResponse="PassThrough" 有效,但这不是我想要的。我不想公开所有失败,我只想在有自定义响应时公开它们。

自动,是默认设置的,但我是故意设置的。但是,文档说必须设置“SetStatus”标志,但我不知道该怎么做。为了测试,我写了以下四个控制器方法,只有 BadRequestD 有效。其他人设置了状态码和状态就好了,但是正文内容是“Bad Request”。

public ActionResult BadRequestA()
{
    Response.StatusCode = 400;
    return Content("weeeeee");
}

public ActionResult BadRequestB()
{
    Response.Status = "400 U DUN MESSED UP";
    return Content("weeeeee");
}

public ActionResult BadRequestC()
{
    Response.Status = "400 U DUN MESSED UP";
    Response.StatusCode = 400;
    return Content("weeeeee");
}

public ActionResult BadRequestD()
{
    Response.StatusCode = 400;
    Response.TrySkipIisCustomErrors = true;
    return Content("weeeeee");
}
4

2 回答 2

46

但是,文档说必须设置“SetStatus”标志,但我不知道该怎么做

它实际上是在讨论IIS C++ SDKfTrySkipCustomErrors中方法的标志/参数IHttpResponse::SetStatus(请参阅我在此处添加到文档底部的注释)。但在 ASP.NET 中,该标志公开为Response.TrySkipIisCustomErrors. 所以根据:

http://www.iis.net/configreference/system.webserver/httperrors

Auto = 仅在设置了 SetStatus 标志时保持响应不变

我希望看到 IIS 默认将响应替换为它自己的 html 错误页面内容(您可以配置该内容是什么),除非您设置:

Response.TrySkipIisCustomErrors = true;

这就是你所看到的。


其他相关信息,在 MVC5 中,即使该标志对于我在 WebForms 中看不到的未捕获异常为假,它似乎也表现得好像该标志为真。作为 Global.asax 中的一种解决方法,我是:

protected void Application_Error()
{
    var error = Server.GetLastError();
    Server.ClearError();
    //code to log error here
    var httpException = error as HttpException;
    Response.StatusCode = httpException != null ? httpException.GetHttpCode() : (int)HttpStatusCode.InternalServerError;
}
于 2014-01-21T23:18:09.043 回答
8

如果您需要具有 4xx http 状态的自定义响应并且仍想使用自定义错误页面,请执行以下操作:

  • existingResponse="Auto"在 web.config 中设置;
  • 在您的操作中设置TrySkipIisCustomErrors = true(返回 4xx 状态和内容的操作);
  • 清除 global.asax 中的服务器错误(in Application_Error()- Server.ClearError())并重新设置状态代码(Reponse.StatusCode = ((HttpException)Server.GetLastError()).GetHttpCode()

奇怪的是 IIS 团队没有existingResponse为特定的状态码实现属性,所以不可能existingResponse="PassThrough"只用于一个(或几个)代码。

于 2017-12-27T22:21:33.110 回答