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

IIS Перезапись текста ответа HTTP Когда статус ответа HTTP установлен как 400

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

    [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 для возврата пользовательской строки Action-specific, когда для кода состояния установлено значение 400?

4b9b3361

Ответ 1

После разговора с моим другом, который является специалистом по настройке 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/). Многие люди считают это угрозой безопасности, поэтому используйте с осторожностью.

Ответ 2

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

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

Response.TrySkipIisCustomErrors = true;
Response.StatusCode = (int)HttpStatusCode.BadRequest;
return this.Json(SomeJsonObject);  // could output string too

Ответ 3

По крайней мере, страница Настройка ответов об ошибках HTTP в IIS 7 сообщает

Примечание

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

EDIT: хотя в ответах этот вопрос, который выглядит довольно похожим, есть ответ, утверждающий, что по крайней мере что-то можно сделать с конфигурацией httpErrors.

Ответ 4

мы закончили с

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

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