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 throttlingBehaviour
to my MusicRepo_DBAccess_ServiceClient
instance?
我的问题是,我应该在上面的代码中的哪个位置将它添加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 ServiceHost
whereas I am not, and they are then opening it (with Open()
) whereas I open the MusicRepo_DBAccess_ServiceClient
instance...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);