WCF: كيف يمكنني إضافة Servicethethethtlingbehavior إلى خدمة WCF؟
-
16-09-2019 - |
سؤال
لدي رمز أدناه لإرجاع مثيل لخدمة 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);
في الآونة الأخيرة كنت أواجه بعض المشاكل مع المهلة، وبالتالي قررت إضافة سلوك خانق، مثل هذا:
var throttlingBehaviour = new ServiceThrottlingBehavior () {
MaxConcurrentCalls=500,
MaxConcurrentInstances=500,
MaxConcurrentSessions = 500
};
سؤالي هو، حيث في التعليمات البرمجية أعلاه يجب أن أضيف هذا throttlingBehaviour
لي MusicRepo_DBAccess_ServiceClient
نموذج؟
من بعض الأمثلة التي وجدت على الويب، فإنها تفعل شيئا مثل هذا:
ServiceHost host = new ServiceHost(typeof(MyService));
ServiceThrottlingBehavior throttleBehavior = new ServiceThrottlingBehavior
{
MaxConcurrentCalls = 40,
MaxConcurrentInstances = 20,
MaxConcurrentSessions = 20,
};
host.Description.Behaviors.Add(throttleBehavior);
host.Open();
لاحظ أنه في الرمز أعلاه يستخدمون ServiceHost
في حين أنني لست كذلك، فهي فتحها (مع Open()
) في حين أفتح MusicRepo_DBAccess_ServiceClient
مثيل ... وهذا ما حصلت عليه في حيرة من أمري.
المحلول
يمكنك تحديد السلوك في ملف التكوين AFAIK، وسيطيع العميل الذي تم إنشاؤه، باستخدام السلوكيات.
تم استبعاد بعض أقسام التكوين للإيجاز
<service
behaviorConfiguration="throttleThis" />
<serviceBehaviors>
<behavior name="throttleThis">
<serviceMetadata httpGetEnabled="True" />
<serviceThrottling
maxConcurrentCalls="40"
maxConcurrentInstances="20"
maxConcurrentSessions="20"/>
</behavior>
</serviceBehaviors>
نصائح أخرى
يمكن القيام به في التعليمات البرمجية لأولئك، مثلي، الذي تكوين في وقت التشغيل.
نسخة VB:
Dim stb As New ServiceThrottlingBehavior
stb.MaxConcurrentSessions = 100
stb.MaxConcurrentCalls = 100
stb.MaxConcurrentInstances = 100
ServiceHost.Description.Behaviors.Add(stb)
C # الإصدار:
ServiceThrottlingBehavior stb = new ServiceThrottlingBehavior {
MaxConcurrentSessions = 100,
MaxConcurrentCalls = 100,
MaxConcurrentInstances = 100
};
ServiceHost.Description.Behaviors.Add(stb);
الاختناق هو سلوك جانب الخدمة (الخادم) وليس الجانب العميل واحد
آرنون