我正在使用IIS 7.5后端构建MVC 3应用程序。在我的控制器上,我有一些允许用户添加/编辑域对象的操作方法。 Action处理HTTP Post,其返回值为string,其中包含在保存过程中遇到的任何验证错误消息。以下是一个动作方法的示例:
[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'
当状态代码设置为400时,有没有办法配置IIS以返回自定义的特定于操作的字符串?
答案 0 :(得分:18)
在与我的朋友交谈后,我发现在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/)。许多人认为这是一种安全风险,因此请谨慎使用。
答案 1 :(得分:13)
在MVC中,也可以在Action by Action的基础上执行此操作。请参阅TrySkipisCustomErrors。
使用:
Response.TrySkipIisCustomErrors = true;
Response.StatusCode = (int)HttpStatusCode.BadRequest;
return this.Json(SomeJsonObject); // could output string too
答案 2 :(得分:1)
至少页面Configuring HTTP Error Responses in IIS 7说
注意强>
您无法自定义以下HTTP错误消息:400, 403.9,411,414,500,500.11,500.14,500.15,501,503和505。
编辑:虽然this question的回复看起来很相似,但有一个回复声称至少可以使用httpErrors配置完成某些事情。
答案 3 :(得分:1)
我们最终选择了
2 ** 64
web.config中的。这允许自定义错误设置状态代码以使IIS不受干扰。