كيف يمكنني العثور على رقم المنفذ الذي يخصصه Net Remoteing؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

إذا قمت بإنشاء TcpChannel باستخدام المنفذ صفر، أي.السماح لـ .Net Remoteing بتخصيص منفذ متاح، هل هناك على أية حال لتحديد رقم المنفذ الذي تم تخصيصه؟

أعلم أنه يمكنني تحديد رقم المنفذ عند إنشاء القناة، لكنني لا أريد القيام بذلك لأنني أريد تشغيل مثيلات متعددة لتطبيق الاستماع على نفس خادم Citrix - كل مثيل يستمع على منفذ مختلف.

من الناحية المثالية، لا أريد أن أواجه مشكلة حجز مجموعة من المنافذ ومن ثم تتبع المنافذ التي تم تخصيصها.أود فقط السماح بتخصيص المنفذ تلقائيًا - ولكن بعد ذلك أحتاج إلى معرفة رقم المنفذ الذي تم تخصيصه.

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

المحلول 2

وكان الحل الخاص بي كما يلي:

  • استخدم التعليمة البرمجية التالية لتحديد منفذ غير مستخدم لكل مثيل لتطبيق العميل:

    IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
    
    using (Socket socket = new Socket(
                 AddressFamily.InterNetwork, 
                 SocketType.Stream, 
                 ProtocolType.Tcp))
    {
        socket.Bind(endPoint);
        IPEndPoint local = (IPEndPoint)socket.LocalEndPoint;
        return local.Port;
    }
    
  • قم بتخزين رقم المنفذ غير المستخدم في تطبيق العميل.

  • قم بتمرير رقم المنفذ المخزن إلى التطبيق المضيف عبر معلمة سطر الأوامر لاستخدامها عند إعداد TcpChannel واستدعاء Activator.GetObject.

  • استخدم رقم المنفذ المخزن في تطبيق العميل في عنوان URL الذي تم تمريره إلى Activator.GetObject.

نصائح أخرى

لا أعرف الكثير عن هذا، ولكن التصفح على MSDN ينص على أن ما بعد الاستخدام الصفري يُرجع ملف TcpServerChannel, ، و أ TcpServerChannel لديه GetChannelUri() طريقة؛هل يشمل ذلك رقم المنفذ؟(قد تحتاج إلى التحليل، عبر new Uri(s).Port).

مرة أخرى، أكمل عملية التخمين.إذا لم يكن الأمر كذلك، فقط قل ;-p

التعديل بواسطة AakashM للإضافة هذا هو النهج الصحيح.التالي

var channel = new TcpChannel(0);

يمكن استرداد المنشور المخصص ديناميكيًا لقناة الخادم المضمنة باستخدام

var channelData = (ChannelDataStore)channel.ChannelData;
var port = new System.Uri(channelData.ChannelUris[0]).Port;

طاقم الممثلين القبيح ضروري لأن TcpChannel.ChannelData يتم كتابة الخاصية كـ object...

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