0

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

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

为了测试极端情况,我尝试将 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)
                }
            }
        }
    }

我也启用了跟踪,并一直在尝试监视它以查看是否有任何变化,但没有任何东西引起我的注意。

4

1 回答 1

1

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

所有 IServiceBehavior 方法都将 System.ServiceModel.Description.ServiceDescription 和 System.ServiceModel.ServiceHostBase 对象作为参数传递。ServiceDescription 参数仅用于检查和插入自定义;如果您以其他方式修改这些对象,则执行行为未定义。

ServiceDescription和对象不是运行时通道堆栈的Binding一部分,而是仅用于确定在ServiceHost打开并首次创建通道侦听器时应如何构建运行时。

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

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

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

于 2013-07-06T15:22:13.817 回答