如何解决在同一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 举报,一经查实,本站将立刻删除。