IIS перезаписывает текст ответа HTTP, когда для статуса ответа HTTP установлено значение 400 - PullRequest
18 голосов
/ 17 января 2012

Я создаю приложение MVC 3 с бэкэндом IIS 7.5.На моем контроллере у меня есть методы действия, которые позволяют пользователю добавлять / редактировать доменные объекты.Действие обрабатывает HTTP Post, имеет возвращаемое значение строки, которая содержит любые сообщения об ошибках валидации, возникшие в процессе сохранения.Вот пример одного метода действия:

    [HttpPost]
    public string CustomerEdit(CustomerModel customerModel)
    {
        var errorMessages = new StringBuilder();
        var serverErrors = new List<string>();

        //Map to a customer domain object
        Mapper.CreateMap<CustomerModel, Customer>();
        var customer = Mapper.Map<CustomerModel, Customer>(customerModel);

        if (customerModel.Oper == "del")
        {
            var customerIds = new List<Guid>();
            customerIds.Add(customer.Id);

            if (!_serverService.DeleteCustomers(customerIds))
            {
                errorMessages.Append("The item could not be deleted");
                Response.StatusCode = Constants.STATUS_SERVER_ERROR;
            }
        }
        else
        {
            //Validate
            if (!_serverService.ValidateCustomer(customer, out serverErrors))
            {
                foreach (var error in serverErrors)
                {
                    ModelState.AddModelError("Validation", error);
                }
            }

            //Save
            if (ModelState.IsValid)
            {
                var saveStatus = _serverService.SaveCustomer(ref customer, _id);

                if (!saveStatus)
                {
                    errorMessages.Append("The server encountered and error during Save");
                    Response.StatusCode = Constants.STATUS_SERVER_ERROR;
                }
            }
            else
            {
                errorMessages.Append(GetValidationErrors(ModelState));
                Response.StatusCode = Constants.STATUS_SERVER_ERROR;
            }
        }
        return errorMessages.ToString();
    }

В случае ошибки мне нужно установить для свойства Response.StatusCode значение 400/500 и вернуть объединенную строку подробныхСообщения об ошибках.К сожалению, IIS всегда удаляет мою строку ошибки из теста ответа, и (в случае 400 ошибок) добавляет заменяет ее строкой «Bad Request»

Есть ли способ настроить IIS для возврата пользовательского, Действие, строка, когда код состояния установлен в 400?

Ответы [ 4 ]

19 голосов
/ 19 января 2012

После разговора с моим другом, который является мастером по настройке IIS, я обнаружил, что в IIS 7+ вы можете добавить следующее в web.config:

<system.webServer>
  <httpErrors errorMode="Detailed"/>
</system.webServer>

Если используется этот параметр в web.config, и вы задаете тело ответа, то тело ответа будет достигать клиента. Если вы НЕ зададите тело ответа, то IIS отобразит подробную страницу ошибки с подробной информацией об ошибке (см. http://learn.iis.net/page.aspx/267/how-to-use-http-detailed-errors-in-iis/). Многие люди считают это угрозой безопасности, поэтому используйте с осторожностью.

14 голосов
/ 10 июня 2013

В MVC это также возможно сделать на основе действия за действием. См. TrySkipisCustomErrors .

Использование:

Response.TrySkipIisCustomErrors = true;
Response.StatusCode = (int)HttpStatusCode.BadRequest;
return this.Json(SomeJsonObject);  // could output string too
1 голос
/ 22 ноября 2016

В итоге мы набрали

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

в файле web.config.Что позволило настраиваемым ошибкам, которые устанавливают коды состояния, оставлять IIS без изменений.

1 голос
/ 17 января 2012

Как минимум на странице Настройка ответов об ошибках HTTP в IIS 7 говорит

Примечание

Нельзя настроить следующие сообщения об ошибках HTTP: 400, 403,9, 411, 414, 500, 500,11, 500,14, 500,15, 501, 503 и 505.

РЕДАКТИРОВАТЬ: хотя в ответах этот вопрос , который выглядит довольно похоже, есть ответ, утверждающий, что по крайней мере что-то можно сделать с конфигурацией httpErrors.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...