我不确定我是否正确测试这些,但我正在尝试确定其中一个超时(关闭,接收,发送,打开)对服务绑定的影响。
我以编程方式设置值,因为我更喜欢它而不是基于配置,所以请不要建议我把它放回配置文件中。
为了测试极端情况,我试图将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)
}
}
}
}
我也启用了跟踪功能,并且一直在尝试监控它以查看是否有任何更改,但没有任何事情引起我的注意。
答案 0 :(得分:1)
您是否在ApplyDispatchBehavior
的MSDN API文档中阅读了此说明?
所有IServiceBehavior方法都通过 System.ServiceModel.Description.ServiceDescription和 System.ServiceModel.ServiceHostBase对象作为参数。该 ServiceDescription参数用于检查和插入 仅限定制;如果你否则修改这些对象 执行行为未定义。
ServiceDescription
和Binding
对象不是运行时通道堆栈的一部分,而是仅用于确定在打开ServiceHost
和通道时应如何构建运行时听众首先创造。
在初始化通道侦听器和运行时通道堆栈期间调用了您的服务行为ApplyDispatchBehavior
,这对于更改Binding对象本身的超时属性来说太迟了,不会对正在构建的通道运行时产生任何影响。
如果你在AddBindingParameters
中设置这些属性,你可能会有更多的运气,因为在构建运行时的过程中会先调用该方法,但即使这可能有效,它仍然是未定义的行为。
但是,实际上,应该在ServiceHost
打开之前在Binding上设置这些属性。