Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 当HTTP响应状态设置为400时,IIS将覆盖HTTP响应文本_Asp.net Mvc 3_Iis 7.5 - Fatal编程技术网

Asp.net mvc 3 当HTTP响应状态设置为400时,IIS将覆盖HTTP响应文本

Asp.net mvc 3 当HTTP响应状态设置为400时,IIS将覆盖HTTP响应文本,asp.net-mvc-3,iis-7.5,Asp.net Mvc 3,Iis 7.5,我正在使用IIS 7.5后端构建一个MVC 3应用程序。在我的控制器上,我有允许用户添加/编辑域对象的操作方法。该操作处理HTTP Post,返回值为string,其中包含保存过程中遇到的任何验证错误消息。以下是一种操作方法的示例: [HttpPost] public string CustomerEdit(CustomerModel customerModel) { var errorMessages = new StringBuilder();

我正在使用IIS 7.5后端构建一个MVC 3应用程序。在我的控制器上,我有允许用户添加/编辑域对象的操作方法。该操作处理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();
    }
[HttpPost]
公共字符串CustomerEdit(CustomerModel CustomerModel)
{
var errorMessages=新的StringBuilder();
var serverErrors=新列表();
//映射到客户域对象
CreateMap();
var customer=Mapper.Map(customerModel);
如果(customerModel.Oper==“del”)
{
var customerIds=新列表();
customerIds.Add(customer.Id);
if(!\u serverService.DeleteCustomers(customerID))
{
errorMessages.Append(“无法删除该项”);
Response.StatusCode=Constants.STATUS\u SERVER\u错误;
}
}
其他的
{
//证实
if(!\u serverService.ValidateCustomer(客户、服务器错误))
{
foreach(serverErrors中的var错误)
{
AddModelError(“验证”,错误);
}
}
//拯救
if(ModelState.IsValid)
{
var saveStatus=\u serverService.SaveCustomer(参考客户,\u id);
如果(!saveStatus)
{
errorMessages.Append(“服务器在保存过程中遇到错误”);
Response.StatusCode=Constants.STATUS\u SERVER\u错误;
}
}
其他的
{
Append(GetValidationErrors(ModelState));
Response.StatusCode=Constants.STATUS\u SERVER\u错误;
}
}
返回errorMessages.ToString();
}
如果发生错误,我需要将Response.StatusCode属性设置为400/500,并返回详细错误消息的串联字符串。不幸的是,IIS总是将我的错误字符串从响应测试中删除,并且(在出现400个错误的情况下)将其添加为字符串“Bad Request”

有没有办法将IIS配置为在状态代码设置为400时返回自定义的、特定于操作的字符串?

至少页面上说

注意

无法自定义以下HTTP错误消息:400, 403.9、411、414、500、500.11、500.14、500.15、501、503和505


编辑:虽然在的响应中(看起来很相似),但有一个响应声称至少可以通过httpErrors配置完成一些事情。

与我的一位朋友交谈后,他是配置IIS的高手,我发现在IIS 7+中,您可以将以下内容添加到web.config:

<system.webServer>
  <httpErrors errorMode="Detailed"/>
</system.webServer>


如果使用web.config中的此设置,并且您设置了响应主体,则响应主体将到达客户端。如果未设置响应正文,则IIS将提供一个包含详细错误信息的详细错误页面(请参阅)。很多人认为这是一个安全风险,所以谨慎使用。

在MVC中,也可以在行动的基础上做到这一点。看

使用:


我们最终选择了

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


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

我找到了一种方法,请参阅我的答案了解详细信息400已允许用于自定义错误页面(例如,在URL错误的情况下,从IIS内核生成的400除外)。在IIS 10中测试。它帮助了我。我使用它的状态代码422(没有尝试与400),这实际上是工作。
 <system.webServer>
     <httpErrors errorMode="Custom" existingResponse="PassThrough" />
 </system.webServer>