2012-03-28 26 views
5

estoy usando la nueva beta Api Web y desea volver"No se puede redirigir después de que se hayan enviado los encabezados HTTP". Al regresar HttpResponseMessage con HttpStatusCode.Unauthorized

HttpResponseMessage<MyObject>(new MyObject{ MyMessage = "Go Away!" }, HttpStatusCode.Unauthorized)

de una de mis acciones ApiController.

Forms Authentication secuestra la respuesta, se bloquea y agrega el error "Cannot redirect after HTTP headers have been sent." y es html a la respuesta.

Las técnicas de supresión normal como this no funcionan con Web Api.

¿Alguien ha encontrado una solución a esto?

He visto this forum post donde las personas informan del mismo problema pero las soluciones allí no funcionan para este caso. La primera solución sugerida utiliza la técnica de supresión normal que no funciona para la API web. El segundo usa un HttpMessageHandler para interceptar la solicitud antes de que llegue al controlador, quiero que el controlador se dispare como siempre.

Después de mirar en el DelegatingHandler puedo obtener acceso al HttpResponseMessage pero no tengo idea de qué hacer con él para evitar que FormsAuth redirija.

+0

Explicar por qué las soluciones propuestas no funcionan podría ser útil aquí. – Maurice

+0

@Maurice buena idea, he actualizado la pregunta – Magpie

+0

Entonces, ¿por qué funcionan _las técnicas de supresión normal_ como las mencionadas en la publicación de blog de Phil Haack? Están destinados a servicios REST como WebAPI. – Maurice

Respuesta

2

que se enfrentó al mismo problema cuando se utiliza la Phil Haack's SuppressFormsAuthenticationRedirectModule

me las arreglé para fijarlo en mi caso en la limpieza de errores del servidor como se muestra a continuación

private void OnEndRequest(object source, EventArgs args) 
{ 
    var context = (HttpApplication)source; 
    var response = context.Response; 

    if (context.Context.Items.Contains(SuppressAuthenticationKey)) 
    { 
     context.Server.ClearError(); //Clearing server error 

     response.TrySkipIisCustomErrors = true; 
     response.ClearContent(); 
     response.StatusCode = 401; 
     response.RedirectLocation = null; 
    } 
} 
+1

Esto funcionó muy bien para mí con ASP.NET Web API. Solo necesitaba usar 'context.Server.ClearError();' Lo llamo condicionalmente desde mi método Global.asax.cs 'Application_PostRequestHandlerExecute'. Esto detuvo ASP.NET de agregar el HTML de redirección después de mi respuesta JSON. –

Cuestiones relacionadas