C# WCF:如何将 ServiceThrottlingBehavior 添加到 WCF 服务?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/794338/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
WCF: How do I add a ServiceThrottlingBehavior to a WCF Service?
提问by Andreas Grech
I have the below code for returning back an instance of my WCF Service ServiceClient:
我有以下代码用于返回我的 WCF 服务实例ServiceClient:
var readerQuotas = new XmlDictionaryReaderQuotas()
{
MaxDepth = 6000000,
MaxStringContentLength = 6000000,
MaxArrayLength = 6000000,
MaxBytesPerRead = 6000000,
MaxNameTableCharCount = 6000000
};
var throttlingBehaviour = new ServiceThrottlingBehavior(){MaxConcurrentCalls=500,MaxConcurrentInstances=500,MaxConcurrentSessions = 500};
binding = new WSHttpBinding(SecurityMode.None) {MaxReceivedMessageSize = 6000000, ReaderQuotas = readerQuotas};
dualBinding = new WSDualHttpBinding(WSDualHttpSecurityMode.None)
{MaxReceivedMessageSize = 6000000, ReaderQuotas = readerQuotas};
endpointAddress = new EndpointAddress("http://localhost:28666/DBInteractionGateway.svc");
return new MusicRepo_DBAccess_ServiceClient(new InstanceContext(instanceContext), dualBinding, endpointAddress);
Lately I was having some trouble with timeouts and so I decided to add a throttling behavior, like such:
最近我在超时方面遇到了一些麻烦,所以我决定添加一个限制行为,如下所示:
var throttlingBehaviour = new ServiceThrottlingBehavior () {
MaxConcurrentCalls=500,
MaxConcurrentInstances=500,
MaxConcurrentSessions = 500
};
My question is, where in the above code should I add this throttlingBehaviourto my MusicRepo_DBAccess_ServiceClientinstance?
我的问题是,我应该在上面的代码中的哪个位置将它添加throttlingBehaviour到我的MusicRepo_DBAccess_ServiceClient实例中?
From some of the examples I found on the web, they are doing something like this:
从我在网上找到的一些例子来看,他们正在做这样的事情:
ServiceHost host = new ServiceHost(typeof(MyService));
ServiceThrottlingBehavior throttleBehavior = new ServiceThrottlingBehavior
{
MaxConcurrentCalls = 40,
MaxConcurrentInstances = 20,
MaxConcurrentSessions = 20,
};
host.Description.Behaviors.Add(throttleBehavior);
host.Open();
Notice that in the above code they are using a ServiceHostwhereas I am not, and they are then opening it (with Open()) whereas I open the MusicRepo_DBAccess_ServiceClientinstance...and this is what got me confused.
请注意,在上面的代码中,他们使用的是 aServiceHost而我不是,然后他们打开它(使用Open())而我打开MusicRepo_DBAccess_ServiceClient实例......这让我感到困惑。
采纳答案by Ta01
You can specify the behavior in the configuration file afaik, and the generated client will obey, using behaviors.
您可以在配置文件 afaik 中指定行为,生成的客户端将遵守,使用行为。
Some configuration sections excluded for brevity
为简洁起见排除了一些配置部分
<service
behaviorConfiguration="throttleThis" />
<serviceBehaviors>
<behavior name="throttleThis">
<serviceMetadata httpGetEnabled="True" />
<serviceThrottling
maxConcurrentCalls="40"
maxConcurrentInstances="20"
maxConcurrentSessions="20"/>
</behavior>
</serviceBehaviors>
回答by ArnonRGO
Throttling is a service side (server) behavior not client side one
节流是一种服务端(服务器)行为,而不是客户端行为
Arnon
阿农
回答by Brian
Can be done in code for those, like me, who configure at runtime.
对于像我这样在运行时配置的人,可以在代码中完成。
vb version:
VB版本:
Dim stb As New ServiceThrottlingBehavior
stb.MaxConcurrentSessions = 100
stb.MaxConcurrentCalls = 100
stb.MaxConcurrentInstances = 100
ServiceHost.Description.Behaviors.Add(stb)
c# version:
C# 版本:
ServiceThrottlingBehavior stb = new ServiceThrottlingBehavior {
MaxConcurrentSessions = 100,
MaxConcurrentCalls = 100,
MaxConcurrentInstances = 100
};
ServiceHost.Description.Behaviors.Add(stb);

