以下是我的合同和OperationContracts,我的问题是当我将WebGet属性用于我的服务正常工作的所有方法时,当我将WebGet属性移除到任何一个OperationContracts时,我会收到以下错误。
操作'ProductDetails'的 合同'IDemo'指定多个 请求身体参数 序列化没有任何包装 元素。最多一个身体参数 可以在没有包装器的情况下序列化 元素。要么移除额外的身体 参数或设置BodyStyle 物业 WebGetAttribute / WebInvokeAttribute为 缠绕。
这些是我的方法
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]
如果我们去WebHttpbinding,是否必须在所有操作合同中包含[WebGet]
属性。
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);
}
答案 0 :(得分:17)
错误消息确切地说明了问题所在:
合同的'ProductDetails'操作 'IDemo'指定多个请求 要序列化的身体参数 没有任何包装元素。 最多 一个身体参数可以序列化 没有包装元素。
您不能拥有期望多个参数的方法,除非您将这些参数包装起来,例如通过在BodyStyle
属性中指定WebGet
设置。
所以是的:您必须对REST服务的每个方法应用[WebGet]
,或者您可以重新组织您的方法以仅接受一个参数(例如,通过包含您拥有的两个或三个参数)现在进入一个包含那些多个参数的类,然后传入该Request类的对象实例。)
[DataContract]
public class AddNumbersRequest
{
[DataMember]
public int X { get; set; }
[DataMember]
public int Y { get; set; }
}
[OperationContract]
string AddNumbers(AddNumbersRequest request);