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

Enable SOAP And REST On Same WCF Service And Contract

我有一个带有 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);
}

public接口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' 指定多个请求主体参数进行序列化,没有任何包装元素。在没有包装器元素的情况下,最多可以序列化一个主体参数。要么删除额外的主体参数,要么将 WebGetAttribute/WebInvokeAttribute 上的 BodyStyle 属性 设置为 Wrapped。

为什么我在没有添加 webget 或 webinvoke 属性的第一个合同中出现 bodystyle 错误?有人可以指点一下吗?

您的服务接口有问题。在一个ServiceContract中,如果其中一个方法使用WebInvoke,其他方法需要使用WebInvoke或webget,所以解决方法是在LoadMessage中添加WebInvoke或webget,或者将LoadMessagesApi上面的WebInvoke修改为OperationContract。