无法识别发送,接收,打开,关闭的WCF绑定超时

时间:2013-07-03 21:12:23

标签: c# wcf c#-4.0 wcf-binding

我不确定我是否正确测试这些,但我正在尝试确定其中一个超时(关闭,接收,发送,打开)对服务绑定的影响。

我以编程方式设置值,因为我更喜欢它而不是基于配置,所以请不要建议我把它放回配置文件中。

为了测试极端情况,我试图将Timeout设置为1秒,这样无论如何它都会被击中。

我不确定是否是这种情况

public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        ServiceThrottlingBehavior behavior = new ServiceThrottlingBehavior();
        behavior.MaxConcurrentCalls = 1000;
        behavior.MaxConcurrentInstances = 1000;
        behavior.MaxConcurrentSessions = 1000;
        serviceDescription.Behaviors.Add(behavior);


        foreach (var endpoint in serviceDescription.Endpoints)
        {
            var binding = endpoint.Binding;
            binding.CloseTimeout = TimeSpan.FromSeconds(1);
            binding.ReceiveTimeout = TimeSpan.FromSeconds(1);
            binding.SendTimeout = TimeSpan.FromSeconds(1);
            binding.OpenTimeout = TimeSpan.FromSeconds(1);
            endpoint.Binding = binding;
        }

        foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers)
        {

            foreach (EndpointDispatcher ed in cd.Endpoints)
            {
                if (!ed.IsSystemEndpoint)
                {
                    ed.DispatchRuntime.InstanceProvider = new MyProvider(serviceDescription.ServiceType)
                }
            }
        }
    }

我也启用了跟踪功能,并且一直在尝试监控它以查看是否有任何更改,但没有任何事情引起我的注意。

1 个答案:

答案 0 :(得分:1)

您是否在ApplyDispatchBehavior的MSDN API文档中阅读了此说明?

  

所有IServiceBehavior方法都通过   System.ServiceModel.Description.ServiceDescription和   System.ServiceModel.ServiceHostBase对象作为参数。该   ServiceDescription参数用于检查和插入   仅限定制;如果你否则修改这些对象   执行行为未定义。

ServiceDescriptionBinding对象不是运行时通道堆栈的一部分,而是仅用于确定在打开ServiceHost和通道时应如何构建运行时听众首先创造。

在初始化通道侦听器和运行时通道堆栈期间调用了您的服务行为ApplyDispatchBehavior,这对于更改Binding对象本身的超时属性来说太迟了,不会对正在构建的通道运行时产生任何影响。

如果你在AddBindingParameters中设置这些属性,你可能会有更多的运气,因为在构建运行时的过程中会先调用该方法,但即使这可能有效,它仍然是未定义的行为。

但是,实际上,应该在ServiceHost打开之前在Binding上设置这些属性。