【问题标题】:WCF erratically timing out despite binding timeout settings尽管绑定超时设置,WCF 异常超时
【发布时间】:2020-02-19 11:19:58
【问题描述】:

我的系统由一堆 WCF 服务组成,可供各种客户端使用。
我要做的第一件事是以交互模式运行服务(我有一个控制台弹出并让我知道服务已启动)。
然后我可以运行一个给定的客户端来执行我的任何 WCF 服务。当实例化客户端时,通过以下方式创建一个通道和相关的超时:

var ctx = new InstanceContext(TestCallbackProxy.Instance);

string baseAddress = Constants.ServiceBaseAddress;

var binding = new NetNamedPipeBinding();
binding.MaxConnections = 10;
binding.OpenTimeout = System.TimeSpan.FromMinutes(1);
binding.CloseTimeout = System.TimeSpan.FromMinutes(1);
binding.ReceiveTimeout = System.TimeSpan.FromMinutes(5);
binding.SendTimeout = System.TimeSpan.FromMinutes(5);

var channelFactory = new DuplexChannelFactory<ITestService>(ctx, binding, new EndpointAddress(baseAddress + serviceName));

 // Create channel to a specified endpoint
 _channel = channelFactory.CreateChannel() as ITestService;

现在,服务最终会在一段时间未使用时超时,据我了解,这是意料之中的。 IE。如果未使用,该通道将简单地消失/被系统丢弃 - 我相信这与可重用性和优化有关。
但是,当试图证明这一理论并减少所有超时时,我无法让服务中断。 IE。在尝试使用服务超过 30 秒时,服务是否应该不会超时/中断?使用的超时时间是:

binding.OpenTimeout = System.TimeSpan.FromMinutes(0.5);
binding.CloseTimeout = System.TimeSpan.FromMinutes(0.5);
binding.ReceiveTimeout = System.TimeSpan.FromMinutes(0.5);
binding.SendTimeout = System.TimeSpan.FromMinutes(0.5);

【问题讨论】:

    标签: c# timeout wcf-binding


    【解决方案1】:

    我认为原因是您应该在服务端设置超时,在服务端设置主机和定义端点,而不是在客户端。这是一个例子:

    var binding = new NetNamedPipeBinding();
    binding.MaxConnections = 10;
    binding.OpenTimeout = TimeSpan.FromMinutes(0.5);
    binding.CloseTimeout = TimeSpan.FromMinutes(0.5);
    binding.ReceiveTimeout = TimeSpan.FromMinutes(0.5);
    binding.SendTimeout = TimeSpan.FromMinutes(0.5);
    
    // Compose URIs
    Uri uriBase = new Uri(baseAddress);
    Uri uri = new Uri(baseAddress + something);
    Uri uriMex = new Uri(baseAddress + something + "/mex");
    
    // Create End Points
    SomeHost = new CustomServiceHost(typeof(TestService), uriBase);
    SomeHost.AddServiceEndpoint(typeof(ITestService), binding, uri);
    SomeHost.AddServiceEndpoint(typeof(IMetadataExchange), binding, uriMex);
    
    // Open the ServiceHost
    SomeHost.Open();
    

    现在你应该看到你的服务在 30 秒后死亡。

    【讨论】:

      猜你喜欢
      • 2011-11-08
      • 2020-06-13
      • 1970-01-01
      • 2018-11-22
      • 1970-01-01
      • 2023-03-26
      • 2011-07-09
      • 1970-01-01
      • 2010-11-02
      相关资源
      最近更新 更多