2011-05-20 8 views
8

Estoy creando un mecanismo de bloqueo para algunas páginas públicas que solo debería permitir a un usuario editarlas al mismo tiempo. El cliente realiza llamadas a la API GET al servidor que solicita un bloqueo, que devuelve un objeto MVC ActionResult. Por alguna razón, cuando estoy ejecutando el programa localmente y devuelvo un new HttpConflictResult("Cannot acquire lock", message); (lo que indica que no se pudo adquirir el bloqueo), funciona bien. El mensaje de error se envía y recibe correctamente y se puede mostrar en una alerta o lo que sea necesario. Sin embargo, cuando accedo al sitio de forma remota, el mensaje se sobrescribe con "La página no se mostró porque hubo un conflicto". ¿Estoy haciendo algo mal o es esto una 'Característica' de IIS o algo así? Si es así, ¿hay una forma de evitarlo para poder recibir el mensaje que quiero para el cliente?La respuesta de falla de HTTP sobrescribe el cuerpo de respuesta para clientes no locales

¡Gracias de antemano por cualquier ayuda!

EDITAR: Perdón, olvidé que HttpConflictResult era una clase heredada. Aquí hay un poco de información:

public class HttpConflictResult : HttpErrorResult 
{ 
    public HttpConflictResult() : this(string.Empty) { } 
    public HttpConflictResult(string errorMessageResource) : this("Conflict", errorMessageResource, true) { } 
    public HttpConflictResult(string statusMessage, string errorMessage) : 
     base(409, statusMessage, errorMessage) { } 
} 

public class HttpErrorResult : ActionResult 
{ 
    protected int _statusCode; 
    protected string _statusMessage; 
    protected string _errorMessage; 

    public HttpErrorResult(int statusCode, string statusMessage, string errorMessageResource) 
    { 
     _statusCode = statusCode; 
     _statusMessage = statusMessage; 
     _errorMessage = errorMessage; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     context.HttpContext.Response.StatusCode = _statusCode; 
     context.HttpContext.Response.StatusDescription = _statusMessage; 
     if(_errorMessage != null) 
     { 
      context.HttpContext.Response.ContentType = "application/json; charset=utf-8"; 
      context.HttpContext.Response.Clear(); 

      System.Web.Script.Serialization.JavaScriptSerializer ser = new System.Web.Script.Serialization.JavaScriptSerializer(); 
      context.HttpContext.Response.Write(ser.Serialize(new { message = _errorMessage })); 
     } 
    } 
} 

Avísame si me dejo algo más. ¡Gracias de nuevo!

+0

Erm, ¿se puede explicar sobre 'HttpConflictResult'? ¿Y cómo lo llamas? –

+0

está enviando un código de error. IIS va a escribir el mensaje para protegerte. Tendrá que configurar IIS. No recuerdo lo que necesita para cambiar ATM –

Respuesta

14

Si está configurando códigos de error (es decir, códigos de estado http en los rangos 4xx o 5xx) y se está ejecutando bajo IIS 7, debe asegurarse de haberle indicado a IIS que no use los mensajes de error estándar .

Hace esto con el parámetro TrySkipIisCustomErrors en el objeto Response. Intente modificar su HttpErrorResult de la siguiente manera:

public override void ExecuteResult(ControllerContext context) 
{ 
    // Set TrySkipIisCustomErrors to ensure ASP.NET sends your error content to the 
    // user instead of the default ASP.NET content under IIS 7. 
    context.HttpContext.Response.TrySkipIisCustomErrors = true; 

    context.HttpContext.Response.StatusCode = _statusCode; 
    context.HttpContext.Response.StatusDescription = _statusMessage; 

    if(_errorMessage != null) 
    { 
     [...] 
    } 
} 
+1

Perfecto. Eso hizo exactamente lo que necesitaba. ¡Muchas gracias! – Chris

+1

No hay problema, es algo que pasé un tiempo golpeando mi cabeza contra antes;) –

+1

@ zhaph-ben-duguid ¡gracias por golpear la cabeza por nosotros! :) – orad

Cuestiones relacionadas