Подтвердить что ты не робот

Как я могу использовать existingResponse = "Авто" успешно?

Итак, я возвращаю подробные ответы на 400 ошибок из моего веб-приложения MVC. Установка существующегоResponse = "PassThrough" работает, но это не то, что я хочу. Я не хочу выставлять все сбои, я только хочу разоблачить их, когда у меня есть пользовательские ответы.

Авто, устанавливается по умолчанию, но я намеренно установил его. Однако в документации указано, что должен быть установлен флаг "SetStatus", но я не знаю, как это сделать. Я написал следующие четыре метода контроллера, чтобы проверить его, и работает только BadRequestD. Остальные устанавливают код состояния, а состояние - отлично, но содержимое тела - это "Плохой запрос".

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");
}
4b9b3361

Ответ 1

Однако в документации указано, что флаг SetStatus должен быть установлен, но я понятия не имею, как это сделать

Фактически он говорит о флаге fTrySkipCustomErrors/аргументе методу IHttpResponse::SetStatus в SDK IIS С++ (см. примечание, которое я добавил в нижней части документации здесь). Но в ASP.NET флаг отображается как Response.TrySkipIisCustomErrors. Итак, согласно:

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

Авто = Отбрасывает ответ не тронутым, только если установлен флаг 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;
}

Ответ 2

Если вам нужны пользовательские ответы с 4xx-статусами http и все еще хотите использовать пользовательские страницы ошибок, что вам нужно сделать:

  • установить existingResponse="Auto" в web.config;
  • установите TrySkipIisCustomErrors = true в действие (которое возвращает статус 4xx и содержимое);
  • очистить ошибку сервера в global.asax(в Application_Error() - Server.ClearError()) и повторно установить код состояния (Reponse.StatusCode = ((HttpException)Server.GetLastError()).GetHttpCode())

Странно, что команда IIS не применяла атрибут existingResponse для определенных кодов состояния, поэтому невозможно использовать existingResponse="PassThrough" только для одного (или нескольких) кодов.