2011-11-21 5 views
6

Ho un un servizio esistente come il metodo di seguito:Come abilitare nativamente JSONP per il servizio WCF esistente?

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

C'è un modo semplice per consentire le chiamate JSONP e anche JSON allo stesso tempo (rilevarlo). È nativo?

risposta

9

Aggiornare il config per assomigliare:

<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 che fornisce una procedura dettagliata di creazione di un servizio WCF che è accessibile cross-domain.

Ciò consentirà al servizio di accettare richieste provenienti da fonti interdominio.

In termini di determinare se per riempire la vostra risposta (la p in jsonp),

Grazie a @carlosfigueira per questo:

Se si utilizza .Net 4 JSONP è supportato in modo nativo. Finché la richiesta ha un parametro stringa di query chiamato "callback" (questo nome può essere configurato), la risposta verrà completata con il nome della funzione .

In caso contrario, è necessario scrivere un'intestazione del messaggio personalizzata che rispecchi la risposta in modo appropriato.

+1

Non è necessario scrivere un ispettore personalizzato - in .NET 4.0 JSONP è supportato in modo nativo. Finché la richiesta ha un parametro stringa di query chiamato "callback" (questo nome può essere configurato), la risposta verrà riempita con il nome della funzione (dato che crossDomainScriptAccessEnabled è impostato su true, come hai detto) – carlosfigueira

+0

@carlosfigueira Molte grazie per questa pepita di informazioni, le mie ultime incursioni nel mondo di jsonp e WCF erano in. 3.5 3.5. Rispondi ora aggiornato. Grande blog a proposito! –

2

La nuova funzione JSONP è esposta tramite WebHttpBinding. La configurazione per la CustomersService sarebbe simile a questo:

<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> 

Consumare JSONP con jQuery

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