WCF مع MSMQIntegrationBinding لا تلتقط رسالة من قائمة الانتظار

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

سؤال

لدي تطبيق BizTalk 2006 يحتوي على sendport باستخدام MSMQ.

لديّ أيضًا تطبيق استضافة WCF WinForms مع العديد من خدمات WCF (في بيئة التطوير ، في الإنتاج ، أستخدم خدمة Windows كاستضافة).

إحدى خدمات WCF التي قمت بإنشائها لديها MSMQIntegrationBinding (نظرًا لحقيقة أن BizTalk ليست خدمة WCF ، لذا فإن NetmsMQBinding غير ممكن).

أرى أن الرسالة يتم وضعها بشكل صحيح على قائمة الانتظار عن بُعد لأنني قمت بتنشيط خيار Journal وأرى الرسالة في قائمة انتظار المجلة ، لكن قائمة الانتظار فارغة وخدمة WCF لا تلتقط الرسالة.

هل يمكن لأي شخص أن يعطيني فكرة أين أن ننظر لحل هذه المشكلة؟

(تحرير 1): لقد قمت ببعض الأبحاث حول هذا الموضوع:

  • عند التواصل مع BizTalk 2006 R2 مع MSMQ ، يتعين عليك استخدام MSMQIntegrationBinding لأن NetmsmqBinding مخصص فقط لـ WCF-to-WCF
  • لذلك أنا عالق في msmqintegrationbinding
  • لا يستخدم ملزمة MSMQIntegration Serializer DataContract. بدلاً من ذلك ، يقوم بتسلسل البيانات المستندة إلى خاصية MSMQMessageserializationFormat. القيمة الافتراضية لها هي MSMQMessageserializationFormat.xml مما يعني أنه سيتم استخدام XmlSerializer. الأساس المنطقي وراء ذلك هو أن نقل تكامل MSMQ مصمم خصيصًا للترابط مع تطبيقات MSMQ / System.
  • نظرًا لأن ربط MSMQInteding يستخدم XMLSerializer القديم البسيط ، فليس لدي القدرة السهلة على استخدام svcutil.exe لإنشاء فئات البيانات الخاصة بي. لذلك لا بد لي من إنشاء فئات التعاقد datacontr

(المرجعي: http://social.msdn.microsoft.com/forums/en/wcf/thread/2d48fe90-5c2a-4156-8a3f-2e21d5638fa1 و http://www.danrigsby.com/blog/index.php/2008/03/07/xmlserializer-vs-datacontractserializer-serialization-in-wcf/)

(تحرير 2):

لقد راجعت بيانات التتبع التشخيصي من خدمة WCF وتم إسقاط الرسالة بسبب استثناء غير مرغوب فيه. الحل الوحيد الآن هو إنشاء فئة DataContract باليد ...

(تحرير 3): باستخدام أداة XSD.exe بدلاً من svcutil.exe قمت بإنشاء فئة DataContract ، لذلك لا يوجد عمل مصنوع يدويًا هنا ؛-) لذا فإن الاستنتاج هو استخدام xsd.exe لفئات عقد البيانات المستخدمة كمعلمة في طريقة خدمة WCF. وذلك لأن MSMQIntegrationBinding يجبرك على جعل جميع أنواع التعاقد على أنها قابلة للتسلسل مع XMLSerializer بدلاً من DataContractSerializer الافتراضي.

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

المحلول

قد ترغب في محاولة تمكين تتبع WCF.

قد يساعدك ذلك في فهم ما يحدث ، وما لا يحدث.

ما يلي هو .config مثال لتمكين التتبع. تأكد من أن .config يقع الملف في نفس المجلد من مضيف خدمة WCF الخاص بك.

<configuration>
  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Warning" 
              propagateActivity="true" >
        <listeners>
          <add name="xml"/>
        </listeners>
      </source>

      <source name="myUserTraceSource" switchValue="Warning, ActivityTracing">
        <listeners>
          <add name="xml"/>
        </listeners>
      </source>
    </sources>

    <sharedListeners>
      <add name="xml" 
           type="System.Diagnostics.XmlWriterTraceListener" 
           initializeData="C:\trace_logs\TraceLog.svclog" />
    </sharedListeners>

  </system.diagnostics>
</configuration>

Microsoft توفر أ أداة عارض تتبع الخدمة لقراءة ملفات .svclog.

تأكد من المسار في initializeData يمكن كتابة خدمتك.

نصائح أخرى

أول شيء للتحقق هنا هو حقوق خدمة WCF. هو الاتصال بقائمة انتظار الرسائل التي يتم إجراؤها بواسطة حساب مسموح به بالاتصال بقائمة انتظار الرسائل.

قد يكون ذلك أيضًا بسبب خطأ في التكوين ، هل تكوين الاتصال الخاص بك صحيح؟

تحقق من سجل الحدث ، قد يكون هناك خطأ هناك ، سيؤدي إلى توجيهك في الاتجاهات الصحيحة.

هل تحققت إذا كانت الرسالة قد تركت بالفعل في قائمة الانتظار بواسطة خدمة WCF ، أم أنها يتم التقاطها وحذفها وعدم معالجتها بواسطة WCF؟

شيء سأحاوله هو إرفاق معالج بـ غير معروف الحدث في مثيل Servicehost ومعرفة ما إذا كان يتم تشغيله عند التقاط الرسالة ... سيكون ذلك مؤكدًا لتوقيع عقد الخدمة الخاص بك محدد بشكل غير صحيح (قد تكون بحاجة إلى استخدام Catch All:

[OperationContract(Action="*")]

للتأكد من أنه يتم توجيهه بشكل صحيح إلى طريقتك.

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