2011-11-21 11 views
6

Tengo un un servicio existente como el método siguiente:¿Cómo activar nativamente JSONP para el servicio WCF existente?

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)] 
public class SomeService : ISomething 
{ 
    public SomeListResults SomeList(SomeParams someParams) 
    { 
      .... 
    } 
} 

¿Hay una manera simple para permitir llamadas JSONP y JSON al mismo tiempo (detectarlo). Es este nativo?

Respuesta

9

actualización de su configuración para que parezca:

<configuration> 
    <system.web> 
    <compilation debug="true" targetframework="4.0"> 
    <authentication mode="None"> 
    </authentication></compilation></system.web> 
    <system.webserver> 
    <modules runallmanagedmodulesforallrequests="true"> 
    </modules></system.webserver> 
    <system.servicemodel> 
    <servicehostingenvironment **aspnetcompatibilityenabled**="true"> 
    <standardendpoints> 
     <webscriptendpoint> 
     <standardendpoint **crossdomainscriptaccessenabled**="true" name=""> 
     </standardendpoint></webscriptendpoint> 
    </standardendpoints> 
    </servicehostingenvironment></system.servicemodel> 
</configuration> 

See here for a blog post proporcionar un tutorial de creación de un servicio WCF que se puede acceder a través del dominio.

Esto permitirá que su servicio acepte solicitudes de fuentes entre dominios.

En términos de la determinación de si la almohadilla de su respuesta (el p en jsonp),

Gracias a @carlosfigueira para esto:

Si se utiliza .Net 4 JSONP está soportado de forma nativa. Siempre que la solicitud tenga un parámetro de cadena de consulta llamado "devolución de llamada" (este nombre se puede configurar), la respuesta se rellenará con el nombre de la función .

De lo contrario, tendrá que escribir un inspector de mensajes personalizado que rellene la respuesta adecuadamente.

+1

No es necesario escribir un inspector de costumbre - en .NET 4.0 JSONP es compatible de forma nativa. Siempre que la solicitud tenga un parámetro de cadena de consulta llamado "devolución de llamada" (este nombre se puede configurar), la respuesta se rellenará con el nombre de función (dado que crossDomainScriptAccessEnabled se establece en verdadero, como usted mencionó) – carlosfigueira

+0

@carlosfigueira Muchas gracias por esta pepita de información, mis últimas incursiones en el mundo de jsonp y WCF estaban en .Net 3.5. Respuesta ahora actualizada. A propósito, estupendo blog. –

2

La nueva función JSONP está expuesta a través de WebHttpBinding. La configuración para el CustomersService se parecería a esto:

<bindings> 
    <webHttpBinding> 
     <binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" /> 
    </webHttpBinding> 
    </bindings> 
    <services> 
    <service name="ServiceSite.CustomersService"> 
     <endpoint address="" binding="webHttpBinding" 
       bindingConfiguration="webHttpBindingWithJsonP" contract="ServiceSite.CustomersService" 
       behaviorConfiguration="webHttpBehavior"/> 
    </service> 
    </services> 

El consumo de JSONP con jQuery

// Get the JsonP data 
$.getJSON('http://localhost:65025/CustomersService.svc/GetCustomers?callback=?', null, function (customers) { 
     alert('Received ' + customers.length + ' Customers'); 
}); 
Cuestiones relacionadas