You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建项目后首次运行时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" />
    • 给上传方法添加幂等校验,上传前先判断对应文件是否已存在,存在则直接返回不重复处理。

4. 服务端会话初始化重复触发

如果服务端配置的实例模式为PerSession且开启了安全会话,首次构建后客户端建立会话时会触发一次服务实例初始化调用,后续会话复用后就不会再触发。

  • 解决方法:将服务端实例模式改为PerCall,关闭安全会话:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class FileService : IService
{
    // 你的服务实现代码
}

内容的提问来源于stack exchange,提问作者Ibrahim shaikh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:06:03