微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在同一WCF服务和合同上启用SOAP和REST

如何解决在同一WCF服务和合同上启用SOAP和REST

我有一个具有basichttpbinding的现有wcf SOAP服务。现在,我想将其扩展为具有仅剩余属性的另一个合同,以使现有方法不会影响使用此合同的客户。

从服务中粘贴一些主要代码段(不包括不必要的代码),如果您需要任何内容​​,请告诉我:

 public interface IMessages
 {
    // existing contract
    [OperationContract(Name = "LoadMessage",IsOneWay = true)]
    void LoadMessage(Guid categoryId,int fileId);

    // new REST contract
    [WebInvoke(Method = "POST",UriTemplate = "/LoadMessagesApi/{param}",ResponseFormat = Webmessageformat.Json,BodyStyle = WebMessageBodyStyle.Wrapped)]
    [Description("Inbound Message")]
    void LoadMessagesApi(string param);
}

公共接口IPayment:IMessages { }

配置:

<service name="Services.PaymentService">

    <endpoint address="xmlservice" 
              binding="webHttpBinding"
              behaviorConfiguration="RestBehavior"
              contract="Services.Interfaces.IPayment""/>
    <endpoint address="" binding="wsHttpBinding"
              bindingConfiguration="wsHttpBindingConfig" 
              name="httpGateway" 
              contract="Services.Interfaces.IPayment" />
  </service>
    

<behaviors>
  <serviceBehaviors>
    <behavior name="RestBehavior">
      <!--BehavIoUr for REST endpoint for HELP enability-->
      <webHttp helpEnabled ="true"></webHttp>
    </behavior>
  </endpointBehaviors>
</behaviors>

但是我得到这个错误

合同'IMessages'的'LoadMessage'操作指定了要序列化的多个请求正文参数,而没有任何包装元素。没有包装器元素,最多可以序列化一个body参数。删除多余的正文参数,或将WebGetAttribute / WebInvokeAttribute上的BodyStyle属性设置为Wrapped。

为什么在未添加webget或webinvoke属性的第一份合同上出现bodystyle错误?有人可以指出吗?

解决方法

您的服务界面有问题。在ServiceContract中,如果其中一种方法使用WebInvoke,则其他方法需要使用WebInvoke或webget,因此解决方案是将WebInvoke或webget添加到LoadMessage,或将LoadMessagesApi上方的WebInvoke修改为OperationContract。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。