WCF الطلبات المتزامنة تتراكم على الملقم عند استخدام WSHttpBinding

StackOverflow https://stackoverflow.com/questions/832871

سؤال

لدي WCF عميل/ملقم التطبيق التي يتم التواصل عبر HTTP باستخدام WSHttpBinding.

إعداد ملقم:الذاتي استضافة ، باستخدام معيار WCF ServiceHost.بلدي الخدمة الفعلية في الدرجة حسب المنسوب:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, 
 InstanceContextMode = InstanceContextMode.PerSession, 
 UseSynchronizationContext = false)]

إعداد عميل:باستخدام visual studio ولدت الوكيل العميل باستخدام متزامن خدمة المكالمات (proxy.call_server_method كتل مثل الخادم وقد ورد في الكامل.)

السيناريو:لدي واحد معين استدعاء الأسلوب الذي يستغرق 20 ثانية لتنفيذ على الملقم.يدعو العميل هذه الطريقة في موضوع مستقل ، لذلك ليس محتجزا ، ConcurrencyMode.Multiple يعني WCF أن تنفيذ ذلك في موضوع مستقل على الخادم أيضا.

هذه النظرية تدعمها حقيقة أنه عندما يتم تكوين التطبيق لاستخدام NetTcpBinding, كل شيء يعمل بشكل جيد.

المشكلة:
إن تكوين التطبيق لاستخدام WSHttpBinding, ثم هذا طويل استدعاء الأسلوب يسبب طلبات http إلى 'العودة'.يجب التحقق من هذا السلوك سواء من تفتيش سجلات بلدي ، قبل التصحيح طلبات HTTP باستخدام الكمان.

على سبيل المثال:

  • العميل يبدأ 20 ثانية طويلة الطلب على خلفية الموضوع
  • العميل يبدأ طلب B و C على الصدارة الموضوع
  • طلبات B و C الحصول على إرسالها إلى الخادم التي لا معالجتها حتى يتم ذلك مع 20 ثانية طويلة الطلب

ولكن في بعض الأحيان:

  • طلبات B و C لا تحصل على إرسالها (حتى أنها لا تظهر في عازف الكمان) حتى 20-الطلب الثاني عاد (وهذا نادر).
    • ملاحظة:الإعداد <add address="*" maxconnection="100"/> في التطبيق العميل.التكوين جعلت هذا (يبدو) يحدث توقف.
  • طلب ب يحصل إرسال ويتلقى ردا على الفور ، في حين طلب C يقام الظهر حتى 20 ثانية واحدة يكمل (وهذا نادر)

وهنا جدول زمني من عازف الكمان مما يدل على المشكلة:(اضغط للحصول على نسخة أكبر)

كما يمكنك أن ترى, طلبات للحصول احتياطيا في الخادم.مرة واحدة 20-الطلب الثاني اكتمال الردود تأتي كل الفيضانات من خلال, ولكن نلاحظ أن هناك بعض الطلبات التي لا الحصول على عقد...

لذلك ، الأسئلة:

  • ما الذي يجري هنا ؟ لماذا لا تعمل بشكل جيد باستخدام NetTcpBinding وليس العمل باستخدام WSHttpBinding?
  • لماذا يتعارض السلوك ؟
  • ماذا يمكنني أن أفعل لإصلاح ذلك ؟

ملاحظات:

  • ليس تأمين على الملقم.لقد حدد نقاط واستخدامها !syncblk و ذلك باستمرار تقارير لا أقفال محتجزين.
  • إنه ليس خيوط (NetTcpBinding لا ينبغي أن العمل على خلاف ذلك)
  • لدي <serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="1000" /> في ملقم التطبيق.التكوين
  • 20-الدعوة الثانية ينتظر فقط على جهاز توقيت ، ليس سحق وحدة المعالجة المركزية أو الشبكة أو القرص
  • أنا أفضل الحل الذي لم يتضمن إعادة يصمم تطبيق استخدام الاتصالات غير المتزامنة...انها مجموعة كبيرة من التعليمات البرمجية القديمة و أنا حقا لا تريد أن تعبث مع الأشياء أنا لا أفهم.
هل كانت مفيدة؟

المحلول 3

[الذاتي الإجابة على إظهار المستخدمين الآخرين ما لدينا في نهاية المطاف الحل]

في النهاية انا لم يتمكن من حل هذه.
لدينا الحل النهائي للتبديل التطبيق لدينا بعيدا عن WSHttpBinding و على NetTcpBinding في الإنتاج - ونحن قد تم التخطيط على القيام بذلك في نهاية المطاف على أي حال لأسباب تتعلق بالأداء.

هذا أمر مؤسف إلى حد ما على الرغم من أنها يترك علامة سوداء على WSHttpBinding والتي قد أو قد لا يكون له ما يبرره.إذا كان أي شخص لا تأتي من أي وقت مضى مع الحل الذي لا تنطوي على التخندق WSHttpBinding, أود أن أعرف عن ذلك

نصائح أخرى

هناك بعض خنق خارج صندوق رأس المال العامل (a .صافي أو ويندوز شيء) هذا التخلف إلى السماح فقط كحد أقصى من اثنين في وقت واحد الصادرة اتصالات HTTP.للأسف لا أستطيع تذكر لي اسم الشيء (و ما كنت وضعت في التطبيق.التكوين أو التطبيق الخاص بك إلى تجاوز ذلك).وبالنظر إلى أن كنت لا ترى ترك طلبات العميل, و أنه فقط HTTP أعتقد أنك ضرب "هذا الشيء".أنا سوف تبقى تبحث عن اسمها.

تحديث:وجدت - حاول هذا على العميل (ولكن تغيير '2' إلى عدد أكبر):

<configuration>
  <system.net>
    <connectionManagement>
      <add address = "*" maxconnection = "2" />
    </connectionManagement>
  </system.net>
</configuration>

رأينا بالضبط نفس الأعراض مع سلمان استضافتها في خدمة IIS/ASP.صافي.

السبب انتهى ASP.NET تزامن طلبات - لا WCF.كان علينا أن تعطيل حالة جلسة العمل (مستوى التطبيق) للحصول على المتزامنة WCF الأساليب.

ويب.التكوين:<system.web> <sessionState mode="Off" /> </system.web>

يرجى ملاحظة أن خدمة يستخدم webHttpBinding لا wsHttpBinding.لذلك أنا لست متأكدا إذا كان هذا يحل أيضا أوريون المشكلة.

أعتقد أنك ضربت البروتوكول الحد و للتغلب على ذلك تحتاج إلى تعديل الإعدادات القياسية على جهاز العميل:

http://support.microsoft.com/kb/183110

http://support.microsoft.com/kb/282402

أعتقد WSHttpBinding يستخدم WinINET الإعدادات عند إصدار الطلبات.

إذا قمت بتغيير إلى BasicHttpBinding تعمل ؟

حتى يبدو هذه هي المشكلة, جلسة اختناق شيء لدغني.

النظر في استخدام ConcurrencyMode.متعددة على كل خدمات الاتصال للسماح المتزامنة المكالمات.

نسيت - أن يكون الطلب ؟ أعتقد RM عبر http يحافظ على النظام ولكن ربما Tcp دورات لا (إلا إذا كنت صراحة طلب ذلك) ؟ هناك سمة على عقد الخدمة التي وصفت أمر/غير مرتبة دورات (أنسى).

غير متأكد ولكن في بعض الأحيان مشكلة مع المكالمات المتزامنة من تطبيق silverlight ترتبط مع المتصفح إدارة الاتصال.بالنسبة لي كان الحل أن تضع ذلك في التطبيق لدينا.xaml.cs ، Application_Startup طريقة descrive هنا: http://weblogs.asp.net/olakarlsson/simultaneously-calling-multiple-methods-on-a-wcf-service-from-silverlight

WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top