当HTTP响应状态设置为400时,IIS覆盖HTTP响应文本

时间:2012-01-17 18:49:52

标签: asp.net-mvc-3 iis-7.5

我正在使用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以返回自定义的特定于操作的字符串?

4 个答案:

答案 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不受干扰。