在同一 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。
我有一个带有 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。