تستغرق رسالة استجابة WCF 40 دقيقة ولا يوجد استثناء مهلة

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

  •  05-07-2019
  •  | 
  •  

سؤال

لدي خدمة WCF مستضافة في IIS7 (الخدمة وتكوين العميل في نهاية هذا المنشور). لقد ركضت عبر سيناريو غريب كنت آمل أن يكون لدى شخص ما بعض الأفكار حول كيفية مهاجمته وإيجاد حل.

الخدمة تكشف فقط عقد واحد ، "ProcessMessage". يمكنني إرسال/تلقي رسائل متزامنة من الخدمة باستخدام هذا العقد على ما يرام مع الأداء المتوقع ، ولكن مكالمة معينة إلى هذا العقد تعيد أكثر من 65 كيلو بايت من البيانات ؛ حوالي 1 ميغابايت. عند الاتصال بها في الأصل ، تلقيت حجم الاستقبال المتوقع تجاوز الخطأ. لذلك قمت بزيادة MaxReceivedMessagesize ، والآن تستغرق هذه المكالمة المعينة 40 دقيقة للعودة إلى العميل. هذا يتجاوز أي من إعدادات المهلة ، وتجاوز ما أتوقع أن يأخذه. وقت معالجة جانب الخادم هو ثانيتين فقط. يبدو أنه تمسك على جانب العميل.

لقد حاولت أيضًا رفع العديد من الحصص الأخرى في الملف دون جدوى.

اي افكار سوف تكون مقدرة جدا. شكرًا.

تكوين الخدمة:

  <system.serviceModel>
<services>
  <service behaviorConfiguration="Lrs.Esf.Facade.Startup.FacadeBehavior"
    name="Lrs.Esf.Facade.Startup.FacadeService">
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="default" contract="Lrs.Esf.Facade.Startup.IFacadeService">
      <identity>
        <servicePrincipalName value="lrsdomain/PensionDev" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>
<bindings>
  <wsHttpBinding>
    <binding name="default">
      <security mode="None"/>
    </binding>
  </wsHttpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior name="Lrs.Esf.Facade.Startup.FacadeBehavior">
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
      <serviceMetadata httpGetEnabled="true" />
      <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="true" />

    </behavior>
  </serviceBehaviors>
</behaviors>

تكوين العميل:

  <system.serviceModel>
<bindings>
  <wsHttpBinding>
    <binding name="WSHttpBinding_IFacadeService" closeTimeout="00:01:00"
        openTimeout="00:01:00" receiveTimeout="00:1:00" sendTimeout="00:01:00"
        bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
        maxBufferPoolSize="52428800" maxReceivedMessageSize="6553600"
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
        allowCookies="false">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647"
          maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
      <security mode="None">          
      </security>
    </binding>
  </wsHttpBinding>
</bindings>
<client>
  <endpoint address="http://esf2.facade.testpe.pg.local/FacadeWcf/FacadeService.svc"
      binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IFacadeService"
      contract="FacadeServiceReference.IFacadeService" name="WSHttpBinding_IFacadeService">
    <identity>
      <servicePrincipalName value="lrsdomain/PensionDev" />
    </identity>
  </endpoint>
</client>

هل كانت مفيدة؟

المحلول 2

لقد اكتشفت السبب الأساسي للقضية وعمل العمل ، ولكن ستكون رؤية إضافية رائعة.

كانت مجموعة البيانات متسلسلة بتنسيق XML بواسطة WCF. لقد أجبرت مجموعة البيانات على التسلسل باعتبارها بايت [] وانخفض الوقت إلى 4 ثوان. أحد التخمين هو أن الهروب من جميع الشخصيات في 4 ميجابايت من XML بحيث كان اتصال HTTP صالحًا هو ما تسبب في المشكلة.

نصائح أخرى

لم تقم بزيادة حجم المعلمات المختلفة على جانب الخادم ، على ما يبدو - يجب أن تحاول بالتأكيد ذلك! استخدم تكوين الربط من ملف تكوين العميل الخاص بك على جانب الخادم أيضًا - قد تكون الخدمة تختنق لأنها لا تزال تتخلف عن حجم الرسالة 64k.

أيضا ، receiveTimeout في العميل ، يكون ربط العميل مضحكًا بعض الشيء - إنه يفتقد إلى رقم صفر:

<binding name="WSHttpBinding_IFacadeService" 
receiveTimeout="00:1:00" 

يجب أن تستخدم receiveTimeout="00:01:00"

مارك

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top