2009-11-10 65 views
7

設置使用webHttpBinding的WCF服務...我可以將方法中的複雜類型返回爲XML ok。我如何接受一個複雜的類型作爲參數?WCF涉及複雜類型的Rest參數

[ServiceContract(Name = "TestService", Namespace = "http://www.test.com/2009/11")] 
public interface ITestService 
{ 
    [OperationContract] 
    [WebInvoke(Method = "POST", 
       BodyStyle = WebMessageBodyStyle.Bare, 
       UriTemplate = "/Person/{customerAccountNumber}, {userName}, {password}, {PersonCriteria}")] 
    Person SubmitPersonCriteria(string customerAccountNumber, 
           string userName, 
           string password, 
           PersonCriteria details); 
} 

由於UriTemplate只允許字符串,最佳做法是什麼?這個想法是,客戶端應用程序會向服務發佈請求,例如某人的搜索條件。該服務將使用包含XML數據的適當對象進行響應。

回答

8

您可以使用rest來發布覆雜類型。

[ServiceContract] 
public interface ICustomerSpecialOrderService 
{  
    [OperationContract] 
    [WebInvoke(Method = "POST", UriTemplate = "deletecso/")] 
    bool DeleteCustomerOrder(CustomerSpecialOrder orderToDelete); 
} 

實施看起來是這樣的:

public bool DeleteCustomerOrder(CustomerSpecialOrder orderToDelete) 
{ 
    // Do something to delete the order here. 
} 

您還可以從一個WPF客戶端的方法:

public void DeleteMyOrder(CustomerSpecialOrder toDelete) 
{ 
    Uri address = new Uri(your_uri_here); 
    var factory = new WebChannelFactory<ICustomerSpecialOrderService>(address); 
    var webHttpBinding = factory.Endpoint.Binding as WebHttpBinding; 
    ICustomerSpecialOrderService service = factory.CreateChannel(); 
    service.DeleteCustomerOrder(toDelete); 
} 

或者你可以用的HttpWebRequest叫它爲好,寫複雜類型轉換爲我們從移動客戶端執行的字節數組。

private HttpWebRequest DoInvokeRequest<T>(string uri, string method, T requestBody) 
{ 
    string destinationUrl = _baseUrl + uri; 
    var invokeRequest = WebRequest.Create(destinationUrl) as HttpWebRequest; 
    if (invokeRequest == null) 
     return null; 

    // method = "POST" for complex types 
    invokeRequest.Method = method; 
    invokeRequest.ContentType = "text/xml"; 

    byte[] requestBodyBytes = ToByteArray(requestBody); 
    invokeRequest.ContentLength = requestBodyBytes.Length; 


    using (Stream postStream = invokeRequest.GetRequestStream()) 
     postStream.Write(requestBodyBytes, 0, requestBodyBytes.Length); 

    invokeRequest.Timeout = 60000; 

    return invokeRequest; 
} 
+0

http://blog.hackedbrain.com/archive/2007/10/05/6124.aspx - ? – kd7 2009-11-10 18:38:59

+0

你的鏈接在你的文章中都被打破了,所以我不確定我能完全知道你在做什麼。你是說你不能使用REST發佈複雜類型嗎? – 2009-11-10 19:06:12

+1

複雜類型如何使用Rest來發布?在bool DeleteCustomerOrder方法中,提交帖子時服務如何獲取傳入的CustomerSpecialOrder對象? – Excelsior 2009-11-10 19:59:29

0

您的選擇:

  1. 使用POST並接受任意複雜的XML文檔,或
  2. 使用GET和數字的方式映射一個URL路徑查詢標準。

我推薦前者,感覺更加REST風格,而且不那麼好笑。 POST將提交一個查詢,作爲響應,您將得到一個queryId,這與您提交的內容有關。

根據REST的想法,您可以隨後獲取該ID以獲取查詢結果。

0

您可以在REST服務調用中傳遞JSON字符串或XML格式數據作爲輸入主體,並在服務合約定義中提及相同的內容。然後它將允許您在REST服務調用中傳遞一個對象作爲輸入。