Fare in modo che un servizio Web WCF funzioni con le richieste GET

sfondo
Ho creato i servizi Web ASMX in passato e sono stato in grado di accedere al servizio dal browser Web e dalle richieste GET Ajax utilizzando la convenzione di indirizzo:
MyService.asmx/MyMethod?Param=xxx

Ho appena iniziato a utilizzare WCF e ho creato un nuovo servizio Web nel mio progetto ASP.NET. Crea un file con l’estensione .svc come MyService.svc.

Situazione attuale
Sono in grado di utilizzare il servizio utilizzando WcfTestClient fornito con VS2008. Sono anche in grado di creare il mio client WCF aggiungendo un riferimento al servizio in un altro progetto o utilizzando la riga di comando svcutil.exe per generare il proxy e il file di configurazione.

Il problema
Quando provo a utilizzare il servizio da un browser utilizzando MyService.svc/MyMethod?MyParam=xxx , ottengo una pagina vuota senza errori.

Quello che ho provato
Ho già aggiunto una baseHttpBinding a web.config e l’ho resa HttpGetEnabled nella configurazione del comportamento. Ho anche aggiunto l’ [WebGet(UriTemplate = "MyMethod?MyParam={MyParam}")] al mio contratto operativo.

Ho già seguito le informazioni in questa altra domanda di overflow dello stack:
REST / SOAP EndPoint per un servizio WCF

Tuttavia, ottengo una pagina vuota o un errore HTTP 404 dopo aver seguito questi passaggi. Non c’è niente di speciale nel codice. Sto solo prendendo una stringa come parametro e restituendo “Hello xxx”. Questa è una cosa tipo base “Hello WCF World” di tipo proof-of-concept.


AGGIORNA – Ecco il codice rilevante

 [ServiceContract] public interface IMyService { [WebGet(UriTemplate = "MyMethod/MyParam={MyParam}")] [OperationContract] string MyMethod(string MyParam); } 

Web.Config – sezione system.serviceModel

                  

Guardando la tua sezione webmodel del servizio web.config , posso vedere che devi aggiungere un webHttpBinding e associare un endPointBehavior che include webHttpGet .

Il tuo contratto operativo è corretto. Ecco come dovrebbe apparire la tua sezione di configurazione system.serviceModel in modo che tu possa essere in grado di utilizzare il servizio da una richiesta HTTP GET.

                        

Assicurati di assegnare un indirizzo diverso al tuo endpoint wsHttpBinding, altrimenti riceverai un errore che ti dice che hai due endpoint in ascolto sullo stesso URI.

Un’altra opzione è lasciare vuoto l’indirizzo in wsHttpBinding, ma assegnare un indirizzo diverso al servizio webHttpBinding. Tuttavia, cambierà anche il tuo indirizzo GET.

Ad esempio, se assegni l’indirizzo come “asmx”, chiameresti il ​​tuo servizio con l’indirizzo ” MyService.svc/asmx/MyMethod?MyParam=xxxx “.

Le normali richieste WCF sono sempre richieste SOAP: non sarai in grado di farlo funzionare solo con il tuo browser, avrai bisogno del Testclient WCF per questo.

C’è un add-on per WCF chiamato WCF REST Starter Kit (che sarà incluso anche in WCF 4.0 con .NET 4.0), che consente di utilizzare i comandi HTTP GET / POST / PUT / DELETE per interrogare i servizi WCF e così via. È necessario scrivere i servizi in modo specifico per REST, tuttavia non è ansible avere SOAP e REST sulla stessa chiamata di servizio.

Marc

Come dice marc_s , lo Starter Kit REST può essere d’aiuto, ma devi anche sapere che .NET 3.5 supporta i servizi REST direttamente in esso. Non è abbastanza completo come quello che si può fare con il kit di partenza, ma è utile.

Il modo in cui funziona consiste nel mettere un attributo [WebGet] sulle operazioni per indicare da dove nell’URL dovrebbero provenire i vari parametri:

 [WebGet(UriTemplate = "helloworld/{name}")] string Helloworld(string name); 

Vedi questo portale per tonnellate di informazioni.

Nota, puoi avere lo stesso servizio esposto sia SOAP che REST se specifichi più endpoint / collegamenti nella configurazione.