2011-05-06 83 views
8

以下是我的合同和OperationContracts,我的問題是當我將WebGet屬性與所有方法一起使用時,我的服務工作正常,當我將WebGet屬性移除到任何一個OperationContracts即時得到下面的錯誤。WCF Rest服務中的WebGet和非WebGet方法

操作 合同「IDemo」指定多個 請求體參數的「產品詳細」是 串行化而沒有任何包裝 元件。最多可以對一個身體參數 進行序列化,而不包裝 元素。請刪除額外的身體 參數或將 WebGetAttribute/WebInvokeAttribute上的BodyStyle 屬性設置爲 包裝。

這是我的方法

string AddNumbers(int x,int y); --- using [WebGet] 

string SubtractNumbers(int x, int y); -- using [WebGet] 

String ProductDetails(string sName, int cost, int Quntity, string binding); -- not using using [WebGet] 

CompositeType GetDataUsingDataContract(CompositeType composite); -- not using [WebGet] 

是否必須包括[WebGet]屬性的所有業務合同,如果我們去的WebHttpBinding ??。

public interface IService1 
{ 
    [OperationContract]   
    string GetData(int value,string binding); 

    [OperationContract] 
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare, 
      ResponseFormat = WebMessageFormat.Xml, 
      UriTemplate = "/Add?num1={x}&num2={y}")] 
    string AddNumbers(int x,int y); 

    [OperationContract] 
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare, 
      ResponseFormat = WebMessageFormat.Xml, 
      UriTemplate = "/Subtract?num1={x}&num2={y}")] 
    string SubtractNumbers(int x, int y); 

    [OperationContract] 
    String ProductDetails(string sName, int cost, int Quntity, string binding); 

    [OperationContract] 
    CompositeType GetDataUsingDataContract(CompositeType composite); 
} 

回答

17

錯誤消息真說,到底是什麼問題:

經營合同 的「產品詳細」「IDemo」指定多個請求 身體參數進行序列化 沒有任何包裝元素。 最多 一個身體參數可以序列化 沒有包裝元素。

您不能擁有期望多於一個參數的方法,除非您包裝這些方法,例如通過在WebGet屬性中指定BodyStyle設置。

所以是的:要麼你必須將[WebGet]應用到你的REST服務的每個方法,或者你可以重新組織你的方法只接受一個參數(例如,通過將你現在擁有的兩個或三個參數合併到一個單個類包含這些多個參數,然後傳入該請求類的對象實例)。

[DataContract] 
public class AddNumbersRequest 
{ 
    [DataMember] 
    public int X { get; set; } 
    [DataMember] 
    public int Y { get; set; } 
} 

[OperationContract] 
string AddNumbers(AddNumbersRequest request); 
+0

感謝您的快速回復馬克,我絕對嘗試了上面的實現,你發佈了它的工作良好,欣賞它。 – venkat 2011-05-06 06:22:52

+1

我想你需要接受答案 – Chandermani 2011-05-06 07:14:21

+0

爲什麼MS允許你在同一個項目中混合使用OperationContract和Web [Get | Invoke],但是當你想讓它成爲一個SOAP唯一的方法? (是的,我知道我在向錯誤的人誇獎,但仍然) – thaBadDawg 2012-03-06 17:50:13

相關問題