Endpoint REST / SOAP per un servizio WCF

Ho un servizio WCF e voglio esporlo sia come servizio RESTfull che come servizio SOAP. Qualcuno ha fatto qualcosa di simile prima?

È ansible esporre il servizio in due endpoint diversi. il SOAP si può usare il binding che supporta SOAP ad es. basicHttpBinding, il RESTful può usare il webHttpBinding. Presumo che il tuo servizio REST sarà in JSON, in tal caso, è necessario configurare i due endpoint con la seguente configurazione di comportamento

     

È un esempio di configurazione endpoint nel tuo scenario

       

quindi, il servizio sarà disponibile all’indirizzo

Applicare [WebGet] al contratto operativo per renderlo RESTful. per esempio

 public interface ITestService { [OperationContract] [WebGet] string HelloWorld(string text) } 

Nota: se il servizio REST non è in JSON, i parametri delle operazioni non possono contenere il tipo complesso.

Rispondi al post per SOAP e RESTful POX (XML)

Per semplice XML vecchio come formato di ritorno, questo è un esempio che funzionerebbe sia per SOAP che per XML.

 [ServiceContract(Namespace = "http://test")] public interface ITestService { [OperationContract] [WebGet(UriTemplate = "accounts/{id}")] Account[] GetAccount(string id); } 

Comportamento POX per REST Plain Old XML

    

endpoint

       

Il servizio sarà disponibile all’indirizzo

Richiesta REST provalo nel browser,

http://www.example.com/xml/accounts/A123

Richiesta SOAP di configurazione dell’endpoint del client per il servizio SOAP dopo l’aggiunta del riferimento al servizio,

     

in C #

 TestServiceClient client = new TestServiceClient(); client.GetAccount("A123"); 

Un altro modo per farlo è esporre due diversi contratti di assistenza e ciascuno con una configurazione specifica. Questo potrebbe generare alcuni duplicati a livello di codice, ma alla fine della giornata, vuoi farlo funzionare.

Questo post ha già un’ottima risposta da “Community wiki” e consiglio anche di guardare il Blog Web di Rick Strahl, ci sono molti buoni post su WCF Resto come questo .

Ho usato entrambi per ottenere questo tipo di servizio MyService … Quindi posso usare l’interfaccia REST da jQuery o SOAP da Java.

Questo è dal mio Web.Config:

                       

E questa è la mia class di servizio (.svc-codebehind, nessuna interfaccia richiesta):

  ///  MyService documentation here ;)  [ServiceContract(Name = "MyService", Namespace = "http://myservice/", SessionMode = SessionMode.NotAllowed)] //[ServiceKnownType(typeof (IList))] [ServiceBehavior(Name = "MyService", Namespace = "http://myservice/")] public class MyService { [OperationContract(Name = "MyResource1")] [WebGet(ResponseFormat = WebMessageFormat.Xml, UriTemplate = "MyXmlResource/{key}")] public string MyResource1(string key) { return "Test: " + key; } [OperationContract(Name = "MyResource2")] [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "MyJsonResource/{key}")] public string MyResource2(string key) { return "Test: " + key; } } 

In realtà io uso solo Json o Xml ma quelli sono entrambi qui per uno scopo dimostrativo. Queste sono richieste GET per ottenere dati. Per inserire dati, utilizzerei il metodo con gli attributi:

 [OperationContract(Name = "MyResourceSave")] [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, UriTemplate = "MyJsonResource")] public string MyResourceSave(string thing){ //... 

Se si desidera solo sviluppare un singolo servizio Web e averlo ospitato su molti endpoint diversi (ad esempio SOAP + REST, con XML, JSON, CSV, HTML outputes). Dovresti anche considerare l’utilizzo di ServiceStack che ho creato esattamente per questo scopo, in cui ogni servizio che sviluppi è automaticamente disponibile su endpoint SOAP e REST immediatamente senza alcuna configurazione richiesta.

L’esempio Hello World mostra come creare un servizio semplice con solo (nessuna configurazione richiesta):

 public class Hello { public string Name { get; set; } } public class HelloResponse { public string Result { get; set; } } public class HelloService : IService { public object Any(Hello request) { return new HelloResponse { Result = "Hello, " + request.Name }; } } 

Non è richiesta altra configurazione e questo servizio è immediatamente disponibile con REST in:

  • SAPONE
  • XML
  • JSON
  • HTML

Inoltre è dotato di un output HTML amichevole (quando viene chiamato con un client HTTP che accetta Accept: text / html ad esempio un browser) in modo da poter visualizzare meglio l’output dei propri servizi.

Anche gestire diversi verbi REST è banale, ecco un’app completa CRUD di servizio REST in 1 pagina di C # (meno di quanto sarebbe necessario per configurare WCF;):

  • Applicazione TODO front-end
  • Implementazione del servizio REST back-end

MSDN sembra avere un articolo per questo ora:

https://msdn.microsoft.com/en-us/library/bb412196(v=vs.110).aspx

Intro:

Per impostazione predefinita, Windows Communication Foundation (WCF) rende gli endpoint disponibili solo per i client SOAP. In Procedura: Creare un servizio HTTP Web WCF di base, un endpoint viene reso disponibile per i client non SOAP. Ci possono essere momentjs in cui si desidera rendere lo stesso contratto disponibile in entrambi i modi, come endpoint Web e come endpoint SOAP. Questo argomento mostra un esempio di come farlo.

Dobbiamo definire la configurazione del comportamento sull’endpoint REST

      

e anche a un servizio

       

Dopo i comportamenti, il passo successivo sono i binding. Ad esempio basicHttpBinding a SOAP endpoint e webHttpBinding a REST .

         

Infine, dobbiamo definire il 2 endpoint nella definizione del servizio. Attenzione per l’indirizzo = “” dell’endpoint, dove al servizio REST non è necessario nulla.

        

Nell’interfaccia del servizio definiamo l’operazione con i suoi attributi.

 namespace ComposerWcf.Interface { [ServiceContract] public interface IComposerService { [OperationContract] [WebInvoke(Method = "GET", UriTemplate = "/autenticationInfo/{app_id}/{access_token}", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] Task autenticationInfo(string app_id, string access_token); } } 

Unendo tutte le parti, questa sarà la nostra definizione system.serviceModel di WCF.

                                   

Per testare entrambi gli endpoint, possiamo usare WCFClient su SOAP e PostMan su REST .

Questo è quello che ho fatto per farlo funzionare. Assicurati di mettere
webHttp automaticFormatSelectionEnabled = “true” all’interno del comportamento dell’endpoint.

 [ServiceContract] public interface ITestService { [WebGet(BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/product", ResponseFormat = WebMessageFormat.Json)] string GetData(); } public class TestService : ITestService { public string GetJsonData() { return "I am good..."; } } 

Modello di servizio interno

            

Comportamento EndPoint