example enable c# .net wcf wcf-rest cors

c# - enable - Soporte CORS dentro de WCF REST Services



enable cors wcf rest service (2)

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í, en caso de que la página web muera algún día. (Odio encontrar enlaces "Tu respuesta es correcta AQUÍ", y luego el enlace está muerto).

<behaviors> <endpointBehaviors> <behavior name="webSupport"> <webHttp /> <CorsSupport /> </behavior> </endpointBehaviors> </behaviors> <extensions> <behaviorExtensions> <add name="CorsSupport" type="WebHttpCors.CorsSupportBehaviorElement, WebHttpCors, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> </behaviorExtensions> </extensions> <services> <service name="Service.JSonService"> <endpoint address="http://localhost:8080" behaviorConfiguration="webSupport” binding="webHttpBinding" contract="Service.IJSonService" /> </service> </services>

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

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

La parte que me estaba lanzando para un bucle (en mi escenario) es que IE estaba funcionando, pero Firefox no estaba funcionando.

Mi página de origen fue:

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

Así que mi servicio está en:

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

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

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

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

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

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 / atracones que finalmente me llevaron a alguna parte.

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

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

Mi intento de solución fue tener algo como lo siguiente dentro de una 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 la autorización básica de HTTP , lo que significa que cuando una solicitud llega sin el encabezado de 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 se produce cuando intento llamar al servicio desde un navegador. CORS especifica que las solicitudes de origen cruzado solo deben permitirse si el dominio de origen coincide con el dominio listado en el encabezado de respuesta de Control de acceso permitido (* coincide con todos los dominios). Desafortunadamente, cuando el navegador ve la respuesta inicial 401 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?


Para lograr lo que quiere, necesita manejar la autorización, lo cual es posible mediante la implementación y el registro de un HttpModule ... allí emitiría el 401 y junto con cualquier encabezado http que desee ... incluso hay una implementación de ejemplo aquí. SO - vea Agregar autenticación HTTP básica a un servicio REST de WCF

EDITAR - después de un comentario de OP:

Dado que el comentario del OP dice que él es auto hospedante, la solución no es con HTTPModule sino en realidad con IDispatchMessageInspector.BeforeSendReply y con IDispatchMessageInspector.AfterReceiveRequest .

La Autorización debe estar configurada en "Ninguna" e implementada / manejada de forma personalizada en IDispatchMessageInspector ; de esta manera puede agregar cualquier encabezado cuando emita un 401. De lo contrario, el tiempo de ejecución que maneja Basic Auth no llamaría a su IDispatchMessageInspector antes de que Auth sea correcto / positivo.

Aunque esto funciona, TEN CUIDADO de que esto significa que implementas un código sensible a la seguridad y, por lo tanto, debes tomar las medidas adecuadas para garantizar su correcta implementación ...