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?
Ответы
Ответ 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 без изменений.