هل من الممكن مشاركة معاملة بين تطبيق .Net وكائن COM+؟

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

سؤال

لقد أجريت بعض الاختبارات منذ فترة ولم أتمكن من معرفة كيفية القيام بهذا العمل.

المكونات:

  • كائن المعاملات COM+ (تم تطويره في VB6)
  • تطبيق الويب .Net (مع المعاملة) في IIS الذي...
    بإجراء مكالمة إلى مكون COM+
    يقوم بتحديث صف في قاعدة بيانات SQL

اختبارات:

قم بتشغيل تطبيق .Net وفرض استثناء.

نتيجة:

سيتم التراجع عن التحديث الذي تم إجراؤه من تطبيق .Net.
لا يتم التراجع عن التحديث الذي تم إجراؤه بواسطة كائن COM+.

إذا قمت باستدعاء كائن COM+ من صفحة ASP قديمة، فإن العودة إلى الحالة السابقة تعمل.

أعلم أن بعض الناس قد يفكرون "ماذا؟!"COM+ و.Net لا بد أنك فقدت عقلك!"، ولكن هناك بعض الأماكن في هذا العالم حيث لا يزال هناك الكثير من مكونات COM+.كنت أشعر بالفضول فقط لمعرفة ما إذا كان شخص ما قد واجه هذا من قبل وما إذا كنت قد اكتشفت كيفية إنجاح هذا الأمر.

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

المحلول

نظرًا لأن VB و.NET سيستخدمان اتصالات SQL مختلفة (ولا توجد طريقة لجعل ADO وADO.NET يشتركان في نفس الاتصال)، فإن الإمكانية الوحيدة لديك هي إدراج DTC (منسق المعاملات الموزعة).سيقوم DTC بتنسيق المعاملتين المستقلتين بحيث يتم الالتزام بهما أو يتم التراجع عنهما معًا.

من .NET, ، تقوم EnterpriseServices بإدارة وظائف COM+، مثل DTC.في .NET 2.0 وما بعده، يمكنك استخدام مساحة الاسم System.Transactions، مما يجعل الأمور أفضل قليلاً.أعتقد أن شيئًا كهذا يجب أن يعمل (رمز لم يتم اختباره):

void SomeMethod()
{
    EnterpriseServicesInteropOption e = EnterpriseServicesInteropOption.Full;
    using (TransactionScope s = new TransactionScope(e))
    {
        MyComPlusClass o = new MyComPlusClass();

        o.SomeTransactionalMethod();
    }
}

لست على دراية كافية بهذا الأمر لأقدم لك المزيد من النصائح في هذه المرحلة.

على الجانب COM +, ، يجب تكوين الكائن الخاص بك لاستخدام (على الأرجح "يتطلب") معاملة موزعة.يمكنك القيام بذلك من COM+ Explorer، بالانتقال إلى الكائن الخاص بك ملكيات, ، اختيار عملية علامة التبويب، والنقر على "مطلوب".لا أتذكر إذا كان بإمكانك القيام بذلك من خلال الكود أيضًا؛تم إنشاء VB6 قبل إصدار COM+، لذا فهو لا يدعم بشكل كامل كل ما يفعله COM+ (كان دعم المعاملات الخاص به مخصصًا للإصدار السابق لـ COM+، والذي يسمى MS Transaction Server).

إذا كان كل شيء يعمل بشكل صحيح، فيجب أن يتم إدراج كائن COM+ الخاص بك في السياق الموجود الذي تم إنشاؤه بواسطة كود .NET الخاص بك.

يمكنك استخدام العقدة "Distributed Transaction Coordinator ransaction List" في "Component Services" للتحقق من المعاملة الموزعة التي يتم إنشاؤها أثناء المكالمة ومشاهدتها.

انتبه إلى أنه لا يمكنك رؤية التغييرات من مكون COM+ التي تنعكس في استعلامات البيانات من جانب .NET حتى يتم تنفيذ المعاملة!في الواقع، فمن الممكن أن يصل إلى طريق مسدود!تذكر أن DTC سيتأكد من إقران المعاملتين، لكنهما لا يزالان معاملات قاعدة بيانات منفصلة.

نصائح أخرى

كيف يتم تنفيذ هذا؟إذا كنت تستخدم EnterpriseServices لإدارة معاملة .NET، فيجب التراجع عن كلتا المعاملتين، نظرًا لأنك تستخدم نفس السياق لكليهما.

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