【问题标题】:WebGet and non WebGet methods in WCF Rest ServiceWCF Rest Service 中的 WebGet 和非 WebGet 方法
【发布时间】:2011-08-19 21:41:27
【问题描述】:

以下是我的合同和 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);
}

【问题讨论】:

    标签: wcf rest


    【解决方案1】:

    错误消息确实准确地说明了问题所在:

    合约操作'ProductDetails' 'IDemo' 指定多个请求 要序列化的主体参数 没有任何包装元素。 最多 一个body参数可以序列化 没有包装元素。

    你不能有期望多个参数的方法,除非你包装它们,例如通过在WebGet 属性中指定BodyStyle 设置。

    所以是的:要么您必须将[WebGet] 应用于您的 REST 服务的每个方法,或者您可以重新组织您的方法以仅接受一个参数(例如,将您现在拥有的两个或三个参数包装成一个包含多个参数的类,然后传入该 Request 类的对象实例)。

    [DataContract]
    public class AddNumbersRequest
    {
       [DataMember]
       public int X { get; set; }
       [DataMember]
       public int Y { get; set; }
    }   
    
    [OperationContract]
    string AddNumbers(AddNumbersRequest request);
    

    【讨论】:

    • 感谢马克的快速回复,我刚刚尝试了上述实现,您发布了它的工作良好,不胜感激。
    • 为什么 MS 允许您在同一个项目中混合 OperationContract 和 Web[Get|Invoke],但当您希望每个方法都成为仅 SOAP 的方法时,却强制每个方法都由 Web 编程模型发挥作用? (是的,我知道我在向错误的人咆哮,但仍然)
    • @thaBadDawg:没有人强迫您采用这种方法...您可以拥有完全独立的 SOAP 和 REST 服务外观(尽管可能共享通用后端代码)。 MS 需要让很多对什么是“正确”有很多不同看法的人开心....
    • 我选择了两条不同的立面路线。必须这样做来满足两种 RPC 类型似乎并不十分干燥。轻微的烦恼,只是希望避免为了基本相同的目的而开设两个课程。
    猜你喜欢
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    相关资源
    最近更新 更多