Soporte de CORS dentro de los servicios WCF REST

Tengo un servicio WCF REST alojado dentro de un servicio de Windows y me gustaría enviar el encabezado HTTP de Access-Control-Allow-Origin (definido como parte de CORS ) con cada respuesta.

Mi bash de solución fue tener algo como lo siguiente dentro de la implementación de IDispatchMessageInspector :

public void BeforeSendReply(ref Message reply, object correlationState) { var httpResponse = reply.Properties["httpResponse"] as HttpResponseMessageProperty; if (httpResponse != null) { // test of CORS httpResponse.Headers["Access-Control-Allow-Origin"] = "*"; } } 

Normalmente, esto funcionaría, pero desafortunadamente mi servicio también usa autorización básica de HTTP , lo que significa que cuando llega una solicitud sin el encabezado Autorización, WCF envía automáticamente una respuesta 401 solicitando credenciales. Lamentablemente, WCF no llama a mi IDispatchMessageInspector durante este intercambio inicial, por lo que el encabezado Access-Control-Allow-Origin no se agrega al intercambio inicial.

El problema ocurre cuando bash llamar al servicio desde un navegador. CORS especifica que las solicitudes de origen cruzado solo deberían permitirse si el dominio de origen coincide con el dominio enumerado en el encabezado de respuesta de Control de acceso / permiso de origen (* coincide con todos los dominios). Lamentablemente, cuando el navegador ve la respuesta 401 inicial sin el encabezado Access-Control-Allow-Origin, impide el acceso (de acuerdo con la misma política de origen ).

¿Hay alguna forma de agregar un encabezado a la respuesta inicial 401 enviada automáticamente por WCF?

Este tipo me salvó el día.

http://blogs.microsoft.co.il/blogs/idof/archive/2011/07.aspx

Voy a colocar algunas de sus notas aquí, por si acaso esa página web muere algún día. (Odio encontrar enlaces “Tu respuesta está aquí”, y el enlace está muerto).

                   

Ahora, tiene que encontrar su biblioteca descargable llamada “WebHttpCors.dll”.

Pero hay suficiente allí (arriba) para ayudarlo a buscar una resolución en google / bing.

La parte que me estaba arrojando por un bucle (en mi caso) es que IE estaba funcionando, pero Firefox no estaba funcionando.

Mi página de origen fue:

 http://localhost:53692/test/WCFCallTestViaJQ14.htm 

Entonces mi servicio está en:

 http://localhost:8002/MyWCFService/MyWCFMethodByWebGet?state=NC&city=Raleigh 

Así que tuve el tráfico localhost << - >> localhost.

**** Pero los puertos eran diferentes. (53692 y 8002) ****

IE estuvo bien con eso. Firefox no estaba bien con eso.

Entonces debes recordar que cada navegador maneja sus solicitudes .Send () de manera diferente (dentro de JQUERY eso es).

Todo tiene sentido ahora.

 //JavaScript snipplet if (window.XMLHttpRequest) { returnObject = new XMLHttpRequest(); } else if (window.ActiveXObject) { returnObject = new ActiveXObject("Microsoft.XMLHTTP"); } else { msg = "Your browser doesn't support AJAX!"; } 

Aquí hay algunas palabras clave, frases que he estado buscando en Google / binging que finalmente me llevaron a algún lado.

  Result: [Exception... "Component returned failure code: 0x80040111 (NS_ERROR_NOT_AVAILABLE) [nsIXMLHttpRequest.statusText]" nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" location: "JS frame :: http://localhost:53692/test/WCFCallTestViaJQ14.htm :: HandleJQueryError :: line 326" data: no] XMLHttpRequest Send "NS_ERROR_FAILURE" JQuery Ajax WCF Self Hosted CORS JSON 

Para lograr lo que quiere, necesita manejar la autorización usted mismo, lo que es posible mediante la imposición + inscripción de un HttpModule … allí emitiría el 401 y junto con el encabezado http que desee … incluso hay una implementación de ejemplo aquí en SO – ver Agregar autenticación HTTP básica a un servicio WCF REST

EDITAR – después del comentario de OP:

Dado que el comentario del OP dice que es HTTPModule la solución no está en HTTPModule sino en realidad con IDispatchMessageInspector.BeforeSendReply y con IDispatchMessageInspector.AfterReceiveRequest .

La Autorización debe configurarse como “Ninguna” y debe implementarse / gestionarse de forma personalizada en IDispatchMessageInspector ; de esta forma, puede agregar cualquier encabezado al emitir un 401. De lo contrario, el tiempo de ejecución que maneja la autenticación básica no llamaría a su IDispatchMessageInspector antes de la autenticación correcta / positiva.

Aunque esto funciona TENGA CUIDADO con que esto significa que usted mismo implementa un código de seguridad sensible y, por lo tanto, debe tomar las medidas apropiadas para garantizar su correcta implementación …