构建项目后首次运行时WCF方法被调用两次,后续运行正常求排查方案
WCF服务构建后首次调用方法执行两次问题排查
根因定位及对应解决方法
1. 客户端代理首次连接自动重试
构建完成后首次运行时,WCF客户端代理第一次和服务端建立TCP/HTTP连接、完成安全握手的过程如果超时,WCF默认会自动重试1次,导致方法被调用两次。后续连接被代理缓存复用后,不会再触发重试逻辑,因此后续运行正常。
- 解决方法:修改客户端绑定配置,关闭自动重试,延长发送超时时间:
<system.serviceModel> <bindings> <basicHttpBinding> <binding name="FileServerBinding" sendTimeout="00:02:00"> <reliableSession enabled="false" maxRetryCount="0" /> </binding> </basicHttpBinding> </bindings> </system.serviceModel>
2. 流传输模式预校验触发两次请求
你当前用的是带流参数的上传接口,WCF默认会在首次调用时先发送一个不带流数据的预请求,校验服务端可用性、参数合法性以及权限,校验通过后才会发送带流的实际请求。首次构建后客户端没有缓存校验结果,就会出现两次调用,后续校验结果缓存后就恢复正常。
- 解决方法:给
RemoteFileInfo类添加[MessageContract]特性,将流参数设为唯一消息体,关闭预校验:
[MessageContract] public class RemoteFileInfo { [MessageHeader] public string FileServerId { get; set; } [MessageHeader] public string FileName { get; set; } [MessageHeader] public string FileExtension { get; set; } [MessageHeader] public long Length { get; set; } [MessageBodyMember(Order = 1)] public Stream FileByteStream { get; set; } }
3. Web应用首次启动预热重复触发请求
构建后首次运行时Web应用会触发应用池初始化、模块加载,调试模式下的浏览器自动刷新、路由预热组件可能会重复触发一次接口调用。
- 解决方法:
- 发布时关闭Web.config的
debug模式:<compilation debug="false" /> - 给上传方法添加幂等校验,上传前先判断对应文件是否已存在,存在则直接返回不重复处理。
- 发布时关闭Web.config的
4. 服务端会话初始化重复触发
如果服务端配置的实例模式为PerSession且开启了安全会话,首次构建后客户端建立会话时会触发一次服务实例初始化调用,后续会话复用后就不会再触发。
- 解决方法:将服务端实例模式改为
PerCall,关闭安全会话:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] public class FileService : IService { // 你的服务实现代码 }
内容的提问来源于stack exchange,提问作者Ibrahim shaikh
相关产品推荐
相关产品推荐

