如何在 REST 模式下使用 WCF 服务?

Posted

技术标签:

【中文标题】如何在 REST 模式下使用 WCF 服务?【英文标题】:How consume WCF service in REST mode? 【发布时间】:2011-05-31 05:10:22 【问题描述】:

已部署 wcf 服务 (.net 4.0)。服务端配置如下:

<endpoint address="" 
          binding="webHttpBinding" 
          bindingNamespace="https://mydomain/myservice/services"     
          behaviorConfiguration="WebBehavior"
          contract="MyService" />

<endpointBehaviors>
  <behavior name="WebBehavior">
    <webHttp />
  </behavior>
</endpointBehaviors>

尝试在 web 应用中使用服务,web.config 看起来像:

<system.serviceModel>
    <client>      
        <endpoint name="MyServiceEndpointBasicHttp" 
                  address="http://myDomain/myService"
                  binding="webHttpBinding" behaviorConfiguration="webBehavior" 
                  contract="MyNamespace.IMyService" />
     </client>
     <behaviors>
         <endpointBehaviors>
             <behavior name="webBehavior">
                 <webHttp />       
             </behavior>     
          </endpointBehaviors>
     </behaviors>
</system.serviceModel>

调用服务时出现异常:

合约操作'Method1' 'IMyService' 指定多个 请求正文参数为 没有任何包装的序列化 元素。最多一个身体参数 可以在没有包装器的情况下进行序列化 元素。要么删除多余的身体 参数或设置 BodyStyle 财产在 WebGetAttribute/WebInvokeAttribute 到 包裹起来。

经过一番谷歌搜索,我们在方法上设置了[WebGet(BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Xml)],但没有成功...

一个有趣的事情:异常中总是有相同的方法名称,即使我正在调用其他方法......

服务在 REST 模式下工作正常,同时通过输入方法名称和必要参数使用浏览器进行测试...

【问题讨论】:

您能否向我们展示服务合同以及您的服务方法的定义? 【参考方案1】:

您似乎遇到了与此线程类似的问题:WCF Service Proxy throws exception when more than one parameter is used in [OperationContract] method

"您似乎在 VS 中使用添加服务引用对话框创建了代理代码。VS ASR 对话框不完全支持 WCF REST,因此,代理代码缺少 [WebInvoke] 属性。您可以尝试添加 [WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)] 客户端代理中操作的属性?"

【讨论】:

“在客户端代理中的操作上添加属性”是什么意思?必须添加到哪个文件中?

以上是关于如何在 REST 模式下使用 WCF 服务?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Android 使用 WCF Rest 服务

如何在 WCF 4.0 REST 服务上启用基本身份验证?

如何在 WCF 服务中调用 REST API?

如何使用 .Net 4.0 REST WCF 服务?

如何从基于 REST 的 WCF 服务中读取授权标头?

如何在rest wcf服务中上传pdf文件和其他字符串参数