WCF应用从SOAP迁移至REST调用接口报ContractFilter不匹配问题
问题根因
出现ContractFilter不匹配、Action为''的报错,核心是两个REST必要配置缺失,并非服务端无法识别方法名:
- 终结点未关联webHttp行为:你虽然定义了包含
<webHttp/>的终结点行为,但服务对应的endpoint节点没有绑定该行为,WCF仍会按SOAP协议逻辑校验请求的SOAP Action,自然无法处理无SOAP Action的普通HTTP请求。 - 操作方法未配置REST路由特性:WCF REST模式要求每个对外暴露的接口方法标注
[WebGet]或[WebInvoke]特性,明确HTTP方法、URI匹配规则,否则服务端无法将请求路径映射到对应方法。
修复步骤
1. 修正服务配置
首先调整endpoint节点配置,补上行为绑定,同时修复重复地址导致的路由冲突问题:
<endpoint address="" binding="webHttpBinding" bindingConfiguration="NoSecurity" contract="soapcon.IClearCoreSoap" behaviorConfiguration="webHttpBehavior" name="ClearCore"/>
*注意:之前你同时给endpoint配置了绝对地址http://localhost:8853/ClearCore,又在host节点配置了相同的基地址,会导致地址叠加异常,将endpoint的address属性留空即可,最终服务基地址直接使用host下配置的http://localhost:8853/ClearCore。
2. 给契约方法添加REST路由特性
给接口的SecMyPermissions方法添加WebGet特性,指定URI匹配规则,无参数的查询类接口默认使用GET请求即可:
// 需先引用System.ServiceModel.Web命名空间 [ServiceContract] [Guid("5098109F-DB33-44e6-87B8-1929C879515B")] public interface class IClearCoreSoap { [OperationContract] [WebGet(UriTemplate = "/SecMyPermissions", ResponseFormat = WebMessageFormat.Json)] [FaultContract(Exception::typeid)] virtual List<System::String^>^ SecMyPermissions(); }
*如果需要返回XML格式,将ResponseFormat参数修改为WebMessageFormat.Xml即可。
验证
修改完成后重启服务,再执行curl命令调用http://localhost:8853/ClearCore/SecMyPermissions即可正常获取返回结果。如果仍有异常,先排查8853端口是否被旧的SOAP模式服务进程占用,确保当前启动的是更新配置后的服务实例。
内容的提问来源于stack exchange,提问作者Simon Callan
相关产品推荐
相关产品推荐

