【问题标题】:Using WCF, surely REST and SOAP should work in harmony?使用 WCF,REST 和 SOAP 肯定应该协调工作吗?
【发布时间】:2011-09-29 11:10:13
【问题描述】:

REST 只接受字符串..?

所以我要做的是制作一个字符串公开的合同并将其转换为服务器端,然后将其传递给 SOAP 直接调用的我的方法。哪个有效。 (我可以从 firefox 调用 REST)

但是现在,我无法公开我的 SOAP OperationContract 而不引起错误问题:

Operation 'GetServices' of contract 'IServices' specifies multiple request body parameters to be serialized without any wrapper elements. At most one body parameter can be serialized without wrapper elements. Either remove the extra body parameters or set the BodyStyle property on the WebGetAttribute/WebInvokeAttribute to Wrapped.

以下是我公开的 3 个方法。 只有当我隐藏第 3 个时,REST 才能工作。 删除我的 SOAP 连接..(我相信它希望在第 3 个方法上设置 REST,因为它没有被定义,所以无法理解)

    // REST
    [OperationContract]
    [WebGet(UriTemplate = "GET/Services/{CostCentreNo}/{Filter}")]
    List<Services> RestGetServices(String CostCentreNo, String Filter);

    // REST
    [OperationContract]
    [WebGet(UriTemplate = "GET/ServiceDetails/{CostCentreNo}/{ServiceCode}/{Recurring}")]
    List<ServiceDetails> RestGetServiceDetails(String CostCentreNo, String ServiceCode, String Recurring);

    // SOAP
    [OperationContract]
    List<Services> GetServices(Int32 CostCentreNo, Int32 Filter);

当然,我可以只创建一种合约方法,它允许我调用 SOAP 或 REST。

【问题讨论】:

    标签: c# wcf rest soap


    【解决方案1】:

    Can I pass non-string to WCF RESTful service using UriTemplate? 中所述:

    路径中的

    UriTemplate 变量在使用时总是解析为字符串 WebGet 或 WebInvoke。您只能将 UriTemplate 变量绑定到 int, long 等,当它们位于 UriTemplate 的 query 部分时。

    这取自答案(Can I pass non-string to WCF RESTful service using UriTemplate?),粗体格式是我的...

    一个 REST 和 SOAP 可访问方法的示例:

    // REST AND SOAP
    [OperationContract]
    [WebGet(UriTemplate = "/Services?CostCentreNo={CostCentreNo}&Filter={Filter}")]
    List<Services> GetServices(Int32 CostCentreNo, Int32 Filter);
    

    可以通过

    访问

    http://localhost:1337/WCF.IService.svc/rest/Services?CostCentreNo=1&amp;Filter=1

    【讨论】:

    • 唯一的问题是它不遵循 RESTful url 的常规约定。像 angular-resource 这样的服务依赖于像 /item/:id 这样的基本 URL,然后只有 HTTP 方法会改变。如果你有一个不变的基本 url,比如item?id=:id WCF 现在抱怨 WebGet/WebInvoke 方法不能仅通过查询参数来改变它们的 uritemplate。你最终定义了items?page=:pageNum&amp;count=:countitem?id=:id。我们不再有一个通用 URL 来标识我们正在使用的资源或资源类型。
    【解决方案2】:

    REST 只接受字符串

    不,那不是真的。映射到 URL 模板的参数可以是任何基本类型。 WCF 将为您进行转换。如果您使用WebInvoke 而不是WebGet,并且您将使用 PUT 或 POST 方法,您甚至可以在请求中传递整个可序列化对象。

    【讨论】:

      猜你喜欢
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多