كيفية التواصل مع خدمة ويندوز من تطبيق يتفاعل مع سطح المكتب؟

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

سؤال

مع .Net، ما هي أفضل طريقة للتفاعل مع الخدمة (أي.كيف تتواصل معظم تطبيقات الدرج مع خوادمها).سيكون من الأفضل أن تكون هذه الطريقة مشتركة بين الأنظمة الأساسية أيضًا (تعمل في Mono، لذا أعتقد أن الاتصال عن بُعد قد توقف؟)


يحرر:

نسيت أن أذكر أنه لا يزال يتعين علينا دعم الأجهزة التي تعمل بنظام التشغيل Windows 2000 في هذا المجال، لذا فإن WCF وأي شيء أعلى من .Net 2.0 لن يطير.

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

المحلول

انتبه إلى أنه إذا كنت تخطط للنشر في نهاية المطاف على نظام التشغيل Windows Vista أو Windows Server 2008، فلن تنجح العديد من الطرق التي يمكنك من خلالها القيام بذلك اليوم.وذلك بسبب تقديم ميزة أمان جديدة تسمى "Session 0 Isolation".

تم نقل معظم خدمات Windows لتعمل في الجلسة 0 الآن لعزلها بشكل صحيح عن بقية النظام.وامتدادًا لذلك هو أن المستخدم الأول الذي قام بتسجيل الدخول إلى النظام لم يعد يتم وضعه في الجلسة رقم 0، بل يتم وضعه في الجلسة 1.ومن ثم، فإن العزل سيؤدي إلى كسر التعليمات البرمجية التي تقوم بأنواع معينة من الاتصال بين الخدمات وتطبيقات سطح المكتب.

أفضل طريقة لكتابة التعليمات البرمجية اليوم التي ستعمل على نظامي التشغيل Vista وServer 2008 من الآن فصاعدا عند إجراء الاتصال بين الخدمات والتطبيقات هي استخدام واجهة برمجة التطبيقات (API) المناسبة للعمليات المشتركة مثل RPC، و Named Pipes، وما إلى ذلك.لا تستخدم SendMessage/PostMessage لأن ذلك سيفشل في ظل عزل الجلسة 0.

http://www.microsoft.com/whdc/system/vista/services.mspx

الآن، نظرًا لمتطلباتك، ستكون في مأزق قليلًا.بالنسبة للمخاوف المتعلقة بالأنظمة الأساسية، لست متأكدًا من دعم ميزة الاتصال عن بُعد.قد تضطر إلى النزول والعودة إلى المقابس: http://msdn.microsoft.com/en-us/library/system.net.sockets.aspx

نصائح أخرى

إذا كان هذا تطبيقًا وليس خدمة حقيقية، فكن حذرًا بشأن كيفية إعداد اتصالاتك إذا كنت تستخدم الأنابيب أو TCP/IP.إذا قام عدة مستخدمين بتسجيل الدخول إلى جهاز (Citrix، Remote Desktop)، وقام كل مستخدم بتشغيل "خدمة" تطبيق الدرج، فيمكنك مواجهة موقف حيث يكون لديك عمليات متعددة تحاول استخدام نفس المنفذ أو الأنبوب المعروف.بالطبع هذه ليست مشكلة إذا كنت لا تخطط لدعم أنابيب متعددة أو إذا كان لديك خدمة حقيقية بدلاً من تطبيق الدرج الذي يتم تشغيله في كل غلاف مستخدم.

اطلب من خدمتك الاستماع إلى 127.0.0.1 على منفذ محدد مسبقًا باستخدام مقبس دفق TCP قديم عادي.اتصل بهذا المنفذ من تطبيق سطح المكتب الخاص بك.

إنه أمر بسيط جدًا وهو متعدد المنصات تمامًا.

هل حاول أي منكم فعلاً التحكم عن بعد باستخدام Mono؟إنه يعمل بشكل جيد.قد تصطدم ببعض الحالات الزاوية، لكن هذا غير مرجح إلى حد كبير.ما عليك سوى اختبار تطبيقك للعمل عن بُعد عبر الأنظمة الأساسية (MS.Net <-> Mono) من وقت لآخر لاكتشاف أي مواطن خلل محتملة.وابدأ بـ Mono حديث، 2.4.2 هو الحالي.

يعد الاتصال عن بعد خيارًا، ولكنه ليس عبر الأنظمة الأساسية.تتمثل بعض الطرق الأخرى في استخدام الأنابيب المسماة أو IPC أو أحداث kernel.

ومن المضحك أنني كنت سأقترح العمل عن بعد!ال ملاحظات إصدار Mono 1.0 (من archive.org لأن الموقع الأصلي مفقود) أذكر System.Runtime.Remoting.dll كمكتبة مدعومة ولا يذكر أي شيء عن المشكلات المعروفة.

إذا كان الاتصال عن بعد معطلاً، فربما يتعين عليك تنفيذ بروتوكول تأطير الرسائل TCP الخاص بك.لا يحتوي Windows على مآخذ توصيل مجال UNIX مكافئة للاتصال على نفس الجهاز.

يتم تشغيل معظم الخدمات التي تحتوي على مكون واجهة المستخدم الرسومية كمستخدم مسمى، ويُسمح لها بالوصول إلى سطح المكتب.يتيح لك هذا الوصول إليه عبر COM أو .NET ولكن محليًا فقط (إلا إذا كنت تريد التعقيد)

أنا شخصياً أفتح مقبسًا قديمًا عاديًا على الخدمة - نظامها الأساسي المشترك، يسمح لعدة عملاء، ويسمح لأي تطبيق بالوصول إليه، ولا يعتمد على أمان Windows لفتحه، ويسمح بكتابة واجهة المستخدم الرسومية الخاصة بك في أي اللغة التي تريدها (لأن كل شيء يدعم المقابس).

بالنسبة لتطبيق الدرج، قد تحتاج إلى بروتوكول بسيط للتواصل - يمكنك أيضًا استخدام نظام نمط REST لإرسال الأوامر إليه، ودفق XML (yuk) أو تنسيق بيانات مخصص مرة أخرى.

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