【问题标题】:IIS Overwriting HTTP Response Text When HTTP Response Status set as 400当 HTTP 响应状态设置为 400 时 IIS 覆盖 HTTP 响应文本
【发布时间】:2012-01-17 18:49:51
【问题描述】:

我正在构建一个带有 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 配置为返回自定义的、特定于操作的字符串?

【问题讨论】:

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


【解决方案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 中,也可以在逐个操作的基础上执行此操作。见TrySkipisCustomErrors

    用途:

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

    【讨论】:

    • 它帮助了我。我将它与状态码 422 一起使用(未尝试使用 400)
    【解决方案3】:

    至少页面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 配置完成一些事情。

    【讨论】:

    • 我找到了办法,详情请看我的回答
    • 400 已经被允许用于自定义错误页面(例如在错误 URL 的情况下从 IIS 内核生成的 400 除外)。在 IIS 10 中测试。
    【解决方案4】:

    我们最终选择了

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

    在 web.config 中。这允许设置状态代码的自定义错误使 IIS 不受干扰。

    【讨论】:

      猜你喜欢
      • 2014-01-08
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      相关资源
      最近更新 更多