2013-06-19 114 views
1

我正在編寫一個REST風格的Web服務,並且在自身基本步驟方面遇到很大麻煩。ReSTful Web服務發送和接收soap + xml

我可以做如下:

  1. 可以創建RESTful Web服務發送和接收XML(不能用肥皂+ XML)返回給客戶端與webHttpBinding

  2. 可以創建RESTful Web服務和發送和接收使用所述合同肥皂+ xml的定義如下:

    [OperationContract] 
        [WebInvoke(Method = "POST", 
         UriTemplate = "", 
         BodyStyle = WebMessageBodyStyle.Bare, 
         RequestFormat = WebMessageFormat.Xml, 
         ResponseFormat = WebMessageFormat.Xml)]   
        XmlElement PostRequestXML(Stream xmlData); 
    

點(2)是發送和接收soap + xml數據的正確方法嗎?

我在網上做了很多搜索,但找不到更好的鏈接,它解釋了創建Web服務以發送和接收soap + xml的詳細步驟。

我想知道:

  • 什麼是更好的方式來設計我的RESTful網絡服務來發送和接收SOAP + XML?你能告訴我操作合同的定義嗎?

  • 需要使用哪種綁定?如果有任何例子,請聯繫。

    • 你能告訴我關於編寫OperationContract和配置web.config的詳細信息嗎?

請求和響應謹如下。

請求:

Header: 
POST /EnrollmentServer/Discovery.svc HTTP/1.1 
Content-Type: application/soap+xml; charset=utf-8 
User-Agent: Windows Phone 8 Enrollment Client 
Host: EnterpriseEnrollment.Contoso.com 
Content-Length: xxx 
Cache-Control: no-cache 

<?xml version="1.0"?> 
<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" 
xmlns:s="http://www.w3.org/2003/05/soap-envelope"> 
<s:Header> 
<a:Action s:mustUnderstand="1"> 
http://schemas.microsoft.com/windows/management/2012/01/enrollment/IDiscoveryService/Discover 
</a:Action> 
<a:MessageID>urn:uuid: 748132ec-a575-4329-b01b-6171a9cf8478</a:MessageID> 
<a:ReplyTo> 
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address> 
</a:ReplyTo> 
<a:To s:mustUnderstand="1"> 
https://ENROLLTEST.CONTOSO.COM/EnrollmentServer/Discovery.svc 
</a:To> 
</s:Header> 
<s:Body> 
<Discover xmlns="http://schemas.microsoft.com/windows/management/2012/01/enrollment/"> 
<request xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
<EmailAddress>[email protected]</EmailAddress> 
<RequestVersion>1.0</RequestVersion> 
</request> 
</Discover> 
</s:Body> 
</s:Envelope> 

迴應:

頁眉:

HTTP/1.1 200 OK 
Content-Length: 865 
Content-Type: application/soap+xml; charset=utf-8 
Server: EnterpriseEnrollment.Contoso.com 
Date: Tue, 02 Aug 2012 00:32:56 GMT 



<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" 
xmlns:a="http://www.w3.org/2005/08/addressing"> 
<s:Header> 
<a:Action s:mustUnderstand="1"> 
http://schemas.microsoft.com/windows/management/2012/01/enrollment/IDiscoveryService/DiscoverResponse 
</a:Action> 
<ActivityId> 
d9eb2fdd-e38a-46ee-bd93-aea9dc86a3b8 
</ActivityId> 
<a:RelatesTo>urn:uuid: 748132ec-a575-4329-b01b-6171a9cf8478</a:RelatesTo> 
</s:Header> 
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema">> 
<DiscoverResponse 
xmlns="http://schemas.microsoft.com/windows/management/2012/01/enrollment"> 
<DiscoverResult> 
<AuthPolicy>OnPremise</AuthPolicy> 
<AuthUrl/> 
<EnrollmentPolicyServiceUrl> 
https://enrolltest.contoso.com/ENROLLMENTSERVER/DEVICEENROLLMENTWEBSERVICE.SVC 
</EnrollmentPolicyServiceUrl> 
<EnrollmentServiceUrl> 
https://enrolltest.contoso.com/ENROLLMENTSERVER/DEVICEENROLLMENTWEBSERVICE.SVC 
</EnrollmentServiceUrl> 
<FederatedServiceName/> 
<FederatedServicePolicy/> 
</DiscoverResult> 
</DiscoverResponse> 
</s:Body> 
</s:Envelope> 
+0

我現在不能舉一個例子(沒時間),但是你可以使用選項2併爲你的服務公開端點 - 例如WebHttpBinding(用於REST)和BasicHttpBinding(用於SOAP)。谷歌應該提供大量關於如何做到這一點的例子。 – Tim

+0

創建兩個不同的點需要使用兩個不同的地址,但協議對GET和POST使用相同的URI。我如何使用兩個不同端點的相同URI? –

+0

有趣的是在你的#2你沒有指定一個模板Uri所以它怎麼可能是RESTful! :)整個休息點是公開Uri模板,這意味着在這裏你需要放置一些東西,所以我甚至不知道這是如何接近於RESTful。我在WCF看到很多人認爲他們正在創造一些RESTful但他們甚至沒有指定Uri,這是沒有意義的 – PositiveGuy

回答

3

我創造了許多WCF API,其中有些是REST。 我的主要理解是 - 不要使用它! WCF很好地支持您選擇在服務器和客戶端之間使用的協議類型。 使用它你付出的性能和耐用性。 如果你已經把你的想法放在REST(這是一個很好的選擇),我建議你深入研究ServiceStack。這是迄今爲止最成熟,維護和先進的.NET REST框架。通過在路上做出許多明智的選擇,它易於使用並可幫助您正確構建API。 給它一個鏡頭,永不回頭!

+0

微軟移動設備管理協議說我需要實現RESTful Web服務。因爲Web服務客戶端的某些部分是由Microsoft編寫的。 –