WCF服务未捕获SAP系统请求的排查与修复方案咨询
排查与修复IIS托管WCF服务未接收SAP请求的问题
一、先确认IIS是否拦截请求
- 查看IIS原始日志:默认路径为
C:\inetpub\logs\LogFiles\W3SVC<站点ID>,找到SAP请求对应的记录,重点看状态码(4xx/5xx表示请求被拦截或处理失败),同时确认请求的URL、头信息是否正确。 - 检查IIS请求筛选与URL重写规则:
- 打开IIS管理器,定位到目标站点,点击「请求筛选」,查看是否有规则限制了自定义头
CallingType的长度、格式,或者直接拒绝了携带该头的请求。 - 查看「URL重写」模块,检查是否存在将请求重定向、改写或拒绝的规则,导致请求无法到达WCF服务。
- 打开IIS管理器,定位到目标站点,点击「请求筛选」,查看是否有规则限制了自定义头
- 启用失败请求跟踪:
站点右键→「配置」→「失败请求跟踪规则」,添加规则捕获4xx/5xx状态码的请求。生成的日志位于C:\inetpub\logs\FailedReqLogFiles,通过日志可以追踪请求在IIS各个模块的处理流程,精准定位拦截点。
二、WCF服务端配置与日志排查
- 自定义头配置说明:
如果WCF服务的契约没有强制要求携带CallingType头,不需要在web.config中额外配置。若服务逻辑需要读取该头,直接在代码中获取即可:
只有当WCF启用了严格的消息验证(如自定义行为限制头范围)时,才需要额外配置允许该头。// 在服务方法内读取自定义头 var context = OperationContext.Current; var callingType = context.IncomingMessageHeaders.GetHeader<string>("CallingType", string.Empty); - 开启WCF详细日志:
在web.config的<system.serviceModel>节点下添加日志配置,记录完整的请求处理过程,判断请求是否到达WCF:
注意提前创建日志目录(如<system.diagnostics> <sources> <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true"> <listeners> <add name="svcTraceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="D:\WCFLogs\ServiceTrace.svclog" /> </listeners> </source> <source name="System.ServiceModel.MessageLogging"> <listeners> <add name="msgTraceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="D:\WCFLogs\MessageLog.svclog" /> </listeners> </source> </sources> </system.diagnostics> <system.serviceModel> <diagnostics> <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" maxMessagesToLog="3000" /> </diagnostics> </system.serviceModel>D:\WCFLogs),并给IIS应用池进程授予读写权限。之后用SvcTraceViewer.exe打开日志文件,即可查看请求是否到达WCF、是否存在消息解析错误。
三、抓包验证请求真实性
在WCF服务器上使用Wireshark或Fiddler抓包,确认SAP发送的请求确实包含CallingType头,且头的格式符合HTTP规范(比如大小写正确、无特殊字符干扰)。有时F5放行后,请求可能在传输环节被篡改,导致IIS或WCF无法正常解析。
四、排查安全工具的后续限制
除F5的请求头验证外,检查IIS上是否安装了其他安全模块(如URLScan、ModSecurity),查看这些模块的规则是否对CallingType头或请求本身进行了拦截。
内容的提问来源于stack exchange,提问作者peter
相关产品推荐
相关产品推荐

