从.NET Core 3.1 REST API调用.NET 4.7.2 WCF服务报(405) Method Not Allowed错误
WCF代理调用405错误排查方案
前置说明
你所用的WCF服务基于.NET Framework 4.7.2开发,仅需开启.NET Framework 4.x版本的WCF HTTP激活即可,.NET Framework 3.5版本的WCF激活功能无需安装,安装报错不影响当前服务运行。
排查步骤(优先和同服务器正常运行的同类型项目做配置对比)
第一步:抓包确认请求参数是否正确
在REST API所在服务器上抓包,对比异常请求和正常项目的WCF调用请求差异:- 检查请求方法是否为WCF要求的POST,有没有被IIS模块/反向代理篡改为GET、OPTIONS
- 检查请求地址是否为正确的
http://wcfservice.mydomain.com/service.svc,无路径缺失/多余后缀 - 检查请求头是否包含正常调用必须的
Content-Type: text/xml; charset=utf-8和SOAPAction头,无遗漏
第二步:检查WCF客户端代码配置
你用svcutil生成的代码没有使用Web.config存储配置,绑定和端点参数都硬编码在代码中,找到客户端构造逻辑做校验:- 确认使用的绑定类型和正常项目一致,优先用
BasicHttpBinding适配HTTP调用,不要误用TCP/命名管道专属绑定 - 确认绑定的安全模式和WCF服务端匹配,无安全配置不匹配问题
- 确认端点地址没有写成本地测试地址,已修改为服务器上的正式部署地址
示例正确构造代码参考:
var binding = new BasicHttpBinding(BasicHttpSecurityMode.None); var endpoint = new EndpointAddress("http://wcfservice.mydomain.com/service.svc"); var client = new 你生成的服务客户端类名(binding, endpoint);- 确认使用的绑定类型和正常项目一致,优先用
第三步:检查异常站点的IIS处理程序配置
该配置为站点级别,同服务器不同站点可独立配置,是大概率问题点:- 打开REST API站点的IIS管理器→处理程序映射→查看有序列表,确认
svc-Integrated-4.0处理程序优先级高于ExtensionlessUrlHandler-Integrated-4.0 - 在站点模块列表中删除
WebDAVModule,在处理程序映射中删除所有WebDAV相关处理程序,避免WebDAV拦截SOAP请求 - 找到
aspNetCore处理程序→右键功能权限→确认允许POST、GET动词,无全局动词限制
检查站点根目录web.config,删除以下类似的错误动词过滤配置:
<verbs allowUnlisted="false"> <add verb="GET" allowed="true" /> </verbs>- 打开REST API站点的IIS管理器→处理程序映射→查看有序列表,确认
第四步:检查反向代理/CDN配置
如果站点前部署了Nginx、IIS ARR、CDN等代理服务,对比正常站点的代理规则:- 确认没有丢弃SOAPAction请求头
- 确认没有修改请求方法、错误重写请求路径
- 确认没有WCF服务站点的IP访问限制,REST API所在服务器的IP已加入白名单
内容的提问来源于stack exchange,提问作者user3021830
相关产品推荐
相关产品推荐

