WCF xidmətinin REST / SOAP endpoints

Bir WCF xidməti var və bunu həm RESTfull xidmətini, həm də SOAP xidmətini göstərmək istərdim. Hər kəs bundan əvvəl belə bir şey mi etdi?

394
09 окт. Wessam Zeidan tərəfindən 09 okt. 2008-10-09 13:11 '08 at 13:11 pm 2008-10-09 13:11
@ 4 cavab

Bir xidmətin iki müxtəlif nöqtədə aça bilərsiniz. SOAP, məsələn, SOAP-ı dəstəkləyən bir bağlama istifadə edə bilər. BasicHttpBinding, RESTful webHttpBinding istifadə edə bilərsiniz. REST xidmətinizin JSON-də olacağını güman edirəm, bu halda aşağıdakı iki konfiqurasiya ilə sonuncu nöqtələri konfiqurasiya etməliyik

 <endpointBehaviors> <behavior name="jsonBehavior"> <enableWebScript/> </behavior> </endpointBehaviors> 

Ssenarinizdə nümunə son nöqtə konfiqurasiyasıdır

 <services> <service name="TestService"> <endpoint address="soap" binding="basicHttpBinding" contract="ITestService"/> <endpoint address="json" binding="webHttpBinding" behaviorConfiguration="jsonBehavior" contract="ITestService"/> </service> </services> 

buna görə də xidmət göstəriləcəkdir

RESTANT etmək üçün əməliyyat müqaviləsinə [WebGet] müraciət edin. məsələn.

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

Qeyd: REST xidməti JSON içində deyilsə, əməliyyatların parametrləri kompleks bir növü ola bilməz.

SOAP və RESTful POX (XML) mesajına cavab verin

Düz köhnə XML üçün qaytarma formatı həm SOAP, həm də XML üçün işləyəcək bir nümunədir.

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

REST Plain Old XML üçün POX davranışı

 <behavior name="poxBehavior"> <webHttp/> </behavior> 

Endpoints

 <services> <service name="TestService"> <endpoint address="soap" binding="basicHttpBinding" contract="ITestService"/> <endpoint address="xml" binding="webHttpBinding" behaviorConfiguration="poxBehavior" contract="ITestService"/> </service> </services> 

Xidmət xidmətində təqdim olunacaq

Brauzerdə REST tələbi edin,

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

Bir SOAP müştəri son nöqtəsi konfiqurasiyasını xidmət istinadına əlavə etdikdən sonra SOAP xidmətinə tələb etmək ,

  <client> <endpoint address="http://www.example.com/soap" binding="basicHttpBinding" contract="ITestService" name="BasicHttpBinding_ITestService" /> </client> 

C #

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

Bunun bir başqa yolu, iki fərqli xidmət müqaviləsini və hər birinə xüsusi bir konfiqurasiya təqdim etməkdir. Bu kod səviyyəsində bəzi kopiyaya səbəb ola bilər, amma günün sonunda onu işə salmaq istəyirəm.

555
09 окт. Cavab Ray Lu 09 oktyabr tərəfindən verilir . 2008-10-09 13:39 '08 at 13:39 pm 2008-10-09 13:39

Bu yazı "Community wiki" dən çox yaxşı bir cavab var və mən də Rick Strahl Veb blogunu seyr etməyi məsləhət görürəm, məsələn, bu WCF Rest haqqında çox yaxşı mesajlar var.

Belə bir MyService xidmətini almaq üçün hər iki üsuldan istifadə etdim ... Sonra REST interfeysini Java ilə jQuery və ya SOAP istifadə edə bilərsiniz.

Bu, Web.Config-dən:

 <system.serviceModel> <services> <service name="MyService" behaviorConfiguration="MyServiceBehavior"> <endpoint name="rest" address="" binding="webHttpBinding" contract="MyService" behaviorConfiguration="restBehavior"/> <endpoint name="mex" address="mex" binding="mexHttpBinding" contract="MyService"/> <endpoint name="soap" address="soap" binding="basicHttpBinding" contract="MyService"/> </service> </services> <behaviors> <serviceBehaviors> <behavior name="MyServiceBehavior"> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> </serviceBehaviors> <endpointBehaviors> <behavior name="restBehavior"> <webHttp/> </behavior> </endpointBehaviors> </behaviors> </system.serviceModel> 
border=0

Və bu mənim kommunal sinifdir (interfeys olmadan, .vc-codebehind):

  /// <summary> MyService documentation here ;) </summary> [ServiceContract(Name = "MyService", Namespace = "http://myservice/", SessionMode = SessionMode.NotAllowed)] //[ServiceKnownType(typeof (IList<MyDataContractTypes>))] [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; } } 

Əslində, mən yalnız Json və ya Xml istifadə edirəm, lakin hər ikisi nümayiş məqsədləri üçün nəzərdə tutulmuşdur. Bunlar məlumat almaq üçün GET sorğularıdır. Məlumatı daxil etmək üçün, atributları olan bir metoddan istifadə edirəm:

 [OperationContract(Name = "MyResourceSave")] [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, UriTemplate = "MyJsonResource")] public string MyResourceSave(string thing){ //... 
33
19 февр. 19 Fevralda Tuomas Hietanen'e cavab verdi 2010-02-19 14:28 '10 at 14:28 2010-02-19 14:28

Yalnız bir web xidməti yaratmaq və onu fərqli uçlara yerləşdirmək istəyirsinizsə (məsələn, SOAP + REST, XML məlumatları, JSON, CSV, HTML çıxışı). Həm də bu iş üçün qurduğum ServiceStack'i istifadə etməyi düşünməlisiniz , hər bir xidmətiniz, konfiqurasiya tələb etmədən, həm SOAP endpoints, həm də REST-də avtomatik olaraq mövcuddur.

Salam Dünya nümunəsi sadə bir xidmətin (konfiqurasiya etmədən) yaradıla biləcəyini göstərir:

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

Heç bir digər konfiqurasiya tələb olunmur və bu xidmət hazırda REST istifadə edərək dərhal mövcuddur:

Xidmətlərinizin çıxışını daha yaxşı şəkildə görməyə imkan verəcək şəkildə, dostluq HTML çıxışı ( qəbul edən bir HTTP müştəri ilə : mətn / html , məsələn, bir brauzer) ilə əlaqələndirilir.

Fərqli REST verilərinin işlənməsi də əhəmiyyətsizdir, burada CREST REST xidmətinin 1-ci səhifəsində tam tətbiq olunur (WCF-ni konfiqurasiya etmək üçün tələb olunanlardan az);

24
18 авг. Cavab mthz 18 avqust verilir . 2010-08-18 04:52 '10 saat 04:52 'da 2010-08-18 04:52

MSDN indi bunun üçün bir məqalə var:

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

Giriş:

Varsayılan olaraq, Windows Communication Foundation (WCF) sonuncu qovluqları yalnız SOAP müştərilərinə təqdim edir. Əsas WCF Web HTTP Xidmətinin Yaratılması bölümündə son nöqtə qeyri-SOAP müştərilər üçün mövcuddur. Eyni müqaviləni hər iki istiqamətdə, bir Web son nöqtəsi olaraq və bir SOAP son nöqtəsi olaraq etmək istədiyiniz zaman ola bilər. Bu bölmə bunu necə bir nümunə göstərir.

6
12 нояб. cavab 12 İyun FMFF verilir. 2012-11-12 20:53 '12 at 8:53 pm 2012-11-12 20:53

əlaqədar digər suallar və ya soruşun