将选定的操作合同公开为 ReST 导致错误合同“IContract”的操作“方法名称”指定多个请求正文

Posted

技术标签:

【中文标题】将选定的操作合同公开为 ReST 导致错误合同“IContract”的操作“方法名称”指定多个请求正文【英文标题】:Exposing selected operation contracts as ReST causing error Operation 'method name' of contract 'IContract' specifies multiple request body 【发布时间】:2016-03-15 12:54:03 【问题描述】:

这里是场景。有一个现有的服务合同,其中包含一些被桌面应用程序使用的方法。现在需要通过 ReST 暴露一些操作合约。但它要求将所有方法公开为 ReST。否则,如果参数被包装,下面的文本通常会出现异常。

真的很混乱。似乎是框架中的错误。

错误信息 -

合约“IService”的“SaveEntitiy”操作指定了多个要序列化的请求主体参数,而无需任何包装器元素。最多一个 body 参数可以在没有包装元素的情况下被序列化。删除额外的正文参数或将 WebGetAttribute/WebInvokeAttribute 上的 BodyStyle 属性设置为 Wrapped。

运营合同。

[ServiceContract]
public interface IService

        [OperationContract] //No need to expose this as ReST
        string SaveEntity(int id,string name);

        [OperationContract]
        [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json)]
        string GetData(int value);

如果我们将 SaveEntity 公开为 ReST,一切正常。表示配置正确。

【问题讨论】:

将 WebInvoke 更改为 WebGet 并指定 UriTemplate @Maximus,您是说 WebInvoke 不允许使用非 ReST 方法的问题吗?在我的实际代码中,我在同一个服务合同中有 POST 方法(操作合同)。在那里我无法避免 WebInvoke 【参考方案1】:

当您尝试使用 GET 时,只需使用 WebGet 方法,如下所示:

[WebGet(UriTemplate = “GetData/input/value”)]

或者

您也可以尝试单独使用 [WebGet]。

【讨论】:

还有需要 WebInvoke 的 POST 方法

以上是关于将选定的操作合同公开为 ReST 导致错误合同“IContract”的操作“方法名称”指定多个请求正文的主要内容,如果未能解决你的问题,请参考以下文章

可移植/可互操作的 WCF 合同

业务测试痛点---解决复杂场景的合同再造

WCF 服务在 2 个不同的服务合同上公开 2 个端点

使用 jenkins 将 java 合同发布到协议流时出现未经授权的错误

企业合同管理,怎样才算合格?

WCF - 在合同列表中找不到合同名称