2010-06-09 21 views
10

Estoy tratando de crear un servicio C# WCF REST que es llamado por jQuery. Descubrí que jQuery requiere que las llamadas AJAX se realicen bajo la misma política de origen. Tengo algunas preguntas sobre cómo proceder.WCF REST con jQuery AJAX - eliminando/trabajando alrededor de la misma política de origen

Ya lo sé;
1. La solución hacky de JSONP con una devolución de llamada del servidor
2. Demasiada sobrecarga del servidor por tener un proxy entre dominios.
3. Uso de Flash en el navegador para hacer la llamada y configurar crossdomain.xml en mi raíz del servidor WCF.

Prefiero no utilizar esto porque;
1. No quiero usar JSON, o al menos no quiero restringirme a usarlo
2. Me gustaría separar el servidor que sirve páginas estáticas del que sirve el estado de la aplicación.
3. Flash en este día y edad está fuera de la cuestión.

Lo que estoy pensando: ¿hay algo así como el archivo crossdomain.xml de Flash que funciona para jQuery? ¿Es esta política de "origen idéntico" una parte de jQuery o es una restricción en navegadores específicos? Si es solo una parte de jQuery, tal vez intente profundizar en el código para evitarlo.





Editar:
Shreddd consiguió más o menos acertadas, ver más abajo. Para hacer esto en C# creé el siguiente método, que todos sus métodos de servicios necesitan llamar:

private void BypassCrossDomain() 
{ 
    WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", "*"); 
} 

Es importante señalar que esto permite a los ataques de cross-site scripting, y tampoco se puede utilizar "*" cuando necesite enviar cookies de terceros con su solicitud.

Respuesta

5

También podría considerar escupir un encabezado http adicional que habilite las solicitudes entre dominios en su servicio web.

Esto se describe aquí:

http://www.w3.org/TR/cors/

https://developer.mozilla.org/en/HTTP_access_control

Así que si se agrega el siguiente encabezado a cualquier contenido que su servicio web ofrece:

Access-Control-Allow-Origin: * 

el navegador Permitir solicitudes de dominios cruzados a ese servicio web. Esto es compatible con la mayoría de los navegadores modernos (ff 3.5, IE 8, safari 4) y parece funcionar muy bien para aplicaciones jquery alojadas en el dominio foo.com que hacen llamadas ajax a bar.com

+0

¡Empecé a usar esto recientemente, gracias! – csauve

1

Por desgracia, la política del mismo origen es una restricción de los navegadores, no explícitamente parte de jQuery, por lo que duda que vas a encontrar una forma de evitar eso.

Sugeriría que su mejor opción es seguir con la solución JSONP. Sí, podría argumentar que es "hacky", pero es un "hack" ampliamente aceptado por exactamente las razones por las que se enfrenta (es decir, es una de las únicas opciones posibles).

En cuanto a estar restringido al uso de JSON, si tiene el control de ambos extremos de la llamada de servicio, no hay razón por la que no pueda usar un patrón de uso de estilo JSONP, pero no use JSON ... Su servidor la respuesta solo se pasará a una función de JavaScript en el lado del cliente, por lo que no hay forma de impedir que regrese, digamos, XML en una cadena & y luego tener su análisis de devolución de llamada & (eso probablemente lo empuje a ser realmente "hacky") "territorio")

+0

Justo lo suficiente. Si está codificado en el navegador, supongo que es con lo que estoy atascado. – csauve

+0

ver a continuación, esta es la forma de hacerlo. no jsonp. funciona para datos xml y datos json – csauve

0

Dos días de búsqueda, y finalmente encontré esto! de lo que csuave!

Dado que mi aplicación WCF es autohospedada (agregar xml a app.config y web.config no me ayudó) ¡pero esto funciona!

private void BypassCrossDomain() 
{ 
    WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-  Origin", "*"); 
} 

- no funciona para auto organizada:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.webServer> 
    <httpProtocol> 
     <customHeaders> 
     <add name="Access-Control-Allow-Origin" 
      value="*" /> 
     </customHeaders> 
    </httpProtocol> 
</system.webServer> 

+1

FYI Access-Control-Allow-Origin = * permite la creación de scripts entre sitios. Tampoco puede hacer "*" si necesita enviar cookies con su solicitud. Puedo ampliar esto más si es necesario. – csauve

Cuestiones relacionadas