2012-01-17 18 views
17

Estoy construyendo una aplicación MVC 3 con un servidor IIS 7.5. En mi controlador, tengo métodos de acción que permiten al usuario agregar/editar objetos de dominio. La acción maneja la publicación HTTP, tiene un valor de retorno de la cadena que contiene los mensajes de error de validación encontrados durante el proceso de guardado. Este es un ejemplo de un método de acción:IIS que sobrescribe el texto de respuesta HTTP cuando el estado de respuesta HTTP está establecido como 400

[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(); 
    } 

En el caso de un error, necesito establecer la propiedad Response.StatusCode a un valor de 400/500, y devolver una cadena concatenada de mensajes de error detallados . Desafortunadamente, IIS siempre elimina mi cadena de error de la prueba de respuesta y (en el caso de 400 errores) agrega la reemplaza con la cadena 'Solicitud incorrecta'

¿Hay alguna manera de configurar IIS para devolver una acción personalizada? -específico, cadena cuando el código de estado está establecido en 400?

Respuesta

17

Después de hablar con un amigo mío que es un genio en la configuración de IIS, encontré que en IIS 7 + se puede añadir lo siguiente a web.config:

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

Si esta configuración en web.config se usa, Y establece el cuerpo de la respuesta, entonces el cuerpo de respuesta llegará al cliente. Si NO establece el cuerpo de la respuesta, IIS publicará una página de error detallada con información detallada del error (consulte http://learn.iis.net/page.aspx/267/how-to-use-http-detailed-errors-in-iis/). Muchas personas consideran que esto es un riesgo para la seguridad, por lo que debe usarse con precaución.

0

Al menos la página Configuring HTTP Error Responses in IIS 7 dice

Nota

No es posible personalizar los siguientes mensajes de error HTTP: 400, 403.9, 411, 414, 500, 500.11, 500.14, 500.15, 501 , 503 y 505.

EDITAR: aunque en las respuestas de this question, que se ve bastante similar, hay una respuesta que dice th al menos se puede hacer algo con la configuración de httpErrors.

+0

He encontrado una manera de hacer esto, por favor vea mi respuesta para más detalles – TheoryOfLight

13

En MVC también es posible hacerlo en una acción por acción. Ver TrySkipisCustomErrors.

Uso:

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

Me ayudó. Lo usé con el código de estado 422 (no probado con 400) –

1

terminamos con ir a

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

en el web.config. Lo cual permitía que los errores personalizados que configuraban códigos de estado dejaran IIS sin molestar.

Cuestiones relacionadas