كيف يتم التعامل مع مكونات STA COM عند استخدامها في خدمة WCF المستضافة في IIS (7+)؟

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

  •  28-09-2019
  •  | 
  •  

سؤال

من ما أفهمه ، عندما يتم تمييز مكون com على أنه يستخدم ستا يستخدم من MTA الموضوع ، من المفترض أن يتم تنظيم المكالمات إلى موضوع STA وتنفيذها من هذا الموضوع المخصص. في حالة تطبيق عميل Windows ، فإن هذا يعني أنه سيتم تنفيذها على مؤشر ترابط واجهة المستخدم (إذا تم تمييزها على أنها STA) ، وسيتم التعامل مع عمليات الاسترجاعات من مكون COM لي بواسطة رسائل Windows المرسلة إلى نافذة مخفية ومعالجتها على حلقة رسالة Windows.

ماذا يحدث على الرغم من أنني استخدمت مكون STA COM في خدمة WCF المستضافة في IIS؟ هل سيكون لعملية العامل حلقة رسائل Windows على موضوع STA؟ هل يمكنني إطلاق سلسلة STA الخاصة بي مع حلقة رسالته الخاصة؟

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

المحلول

يعتني وقت تشغيل COM بإرسال المكالمات إلى أساليب على كائن COM داخل STA: أنت محق في أن هذا يعتمد على نفس آلية نظام التشغيل المستخدمة لإرسال رسائل Windows ، لكن لا داعي للقلق بشأن تحقيق ذلك - كوم يفعل هذا لك تحت الغطاء.

ماذا أنت فعل داعي للقلق هو أي الأشياء التي ستعيش فيها كائنات com. إذا قمت بتثبيت كائنات com التي ترتبط بالشقق باستخدام com interop من خدمة WCF ، فيجب أن تكون حذراً.

إذا كان الخيط الذي تقوم به هذا ليس مؤشر ترابط STA ، فسيعيش جميع كائنات com في العملية الافتراضية مضيف Sta لعملية عامل IIS. لا تريد أن يحدث هذا: ستنتهي جميع كائنات COM لجميع عمليات الخدمة في نفس STA. الفكرة في الاسم - يوجد مؤشر ترابط واحد فقط لجميع الكائنات - وسيتم تسلسل جميع المكالمات إلى أساليبهم في انتظار الخيط الواحد والوحيد في الشقة لتنفيذها. لن يتم توسيع نطاق خدمتك للتعامل مع عملاء متزامنين متعددين.

تحتاج إلى التأكد من أن كائنات COM التي تقوم بتثبيتها لخدمة طلب WCF معين في STA منفصلة عن الكائنات التي تم إنشاؤها للطلبات الأخرى. هناك طريقتان على نطاق واسع للقيام بذلك:

  • قم بتدوير الموضوع الخاص بك ، وتحديد ApartmentState.STA في SetApartmentState() قبل أن تبدأ ، من خلال إنشاء كائنات COM لطلب معين. هذا هو النهج المفصل من قبل سكوت سيل في الرابط في إجابة Kev: إنه يضمن استدعاء كل مكالمة تشغيل خدمة على موضوع جديد من STA. سيكون حل أصعب ولكنه أكثر قابلية للتطوير على طول هذه الخطوط هو تنفيذ مجموعة من الخيوط القابلة لإعادة الاستخدام STA.
  • استضافة كائنات com الخاصة بك في تطبيق com+ ، بحيث يعيشون في عملية dllhost منفصلة ، حيث com+ (من خلال تجريده المسمى ال Activity) يمكن أن تهتم بوضع الكائنات لطلبات مختلفة في STAs مختلفة.

لست متأكدًا مما تعنيه بالضبط عند الرجوع إلى عمليات الاسترجاعات. ربما تعني أن طريقة COM تستدعي بعض واجهة com التي تم تنفيذها في التعليمات البرمجية المدارة الخاصة بك ، من خلال مرجع تم تمريره إلى كائنات com كوسيطة لأحد أساليب كائنات com: إذا كان الأمر كذلك ، فيجب أن يعمل هذا فقط. ولكن ربما تقصد شيئًا آخر ، وفي هذه الحالة ربما يمكنك تعديل السؤال للتوضيح.

نصائح أخرى

لقد وجدت أنك بحاجة إلى ضخ الرسائل على مؤشر ترابط STA في خدمة WCF أو تفوتك عروض الاسترجاعات من كائن COM.

يعمل الكود التالي ، لكنه يتطلب منك الاتصال بكائن COM عبر مرسل.

ComWrapper comWrapper;
Thread localThread;
Dispatcher localThreadDispatcher;

public Constructor()
{
   localThread = new Thread(ThreadProc)
   {
       Name = "test"
   };
   localThread.SetApartmentState(ApartmentState.STA);

   AutoResetEvent init = new AutoResetEvent(false);

   localThread.Start(init);

   init.WaitOne();
}

private void ThreadProc(object o)
{
    localThreadDispatcher = Dispatcher.CurrentDispatcher;
    ((AutoResetEvent)o).Set();

    comWrapper = new ComWrapper()

    Dispatcher.Run();

    localThreadFinished.Set();
 }

ثم إجراء مكالمات على النحو التالي.

public void UsefulComOperation()
{
    localThreadDispatcher.Invoke(new Action( () => comWrapper.UsefulOperation);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top