كيف يمكنني العثور على منفذ TCP مجانا مع NetTcpBinding (WCF) (حتى ملقم يمكن ربط ذلك)

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

سؤال

تجد المقبل منفذ TCP في .صافي يقول كيفية القيام بذلك في الخام .صافي ، ولكن ليس كيفية بأمان إلى هذا مع WCF.

في وحدة الاختبارات ، أنا بحاجة إلى استخدام NetTcpBinding, أنا لا ترغب في رمز القرص الثابت الميناء هو استخدام.

لذلك كيف يمكنني الحصول على NetTcpBinding تلقائيا اختيار ميناء حرا عندما تستخدم في ServiceHost?

كيف يمكنني الحصول على ذلك أن تخبرني ميناء (الكامل أو عنوان نقطة النهاية) وقد اختيارها ؟

أو كيف يمكنني استخدام .صافي العثور على عدد قليل من ميناء صالحة على الملقم ربط ؟


بالنظر إلى أن نسبتى لا يؤدي إلى أي إجابات جديدة ، وأعتقد أننا يمكن أن نفترض أن هناك إجابة جيدة.

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

المحلول 6

في الوقت الحالي أعتقد أن هذا غير ممكن ، شكرا لكل من قدم عمل جولات.

نصائح أخرى

أنت لا تحتاج إلى لفة الخاص بك الميناء-إيجاد المنطق - Windows اختيار ميناء حرا إذا قمت بتحديدها 0.ثم يمكنك معرفة المنفذ الذي تم تعيينه من قبل استجواب المرسلون مثل:

// Specify port 0, this will cause Windows to choose a free port
var baseUri = new Uri("net.tcp://" + Dns.GetHostEntry("").HostName + ":0");
host = new WebServiceHost(typeof(MyService));
var endPoint = host.AddServiceEndpoint(typeof(IMyService), new NetTcpBinding(), baseUri);

 // Tell WCF to actually bind to a free port instead of 0
 endPoint.ListenUriMode = ListenUriMode.Unique;

 host.Open();

 // Now that the host has bound to a specific port, we can find out which one it chose
 return host.ChannelDispatchers.First().Listener.Uri;

تعيين المنفذ إلى الصفر.يسمح نظام التشغيل لاختيار المنافذ المتوفرة لك.إذا كنت بحاجة إلى تحديد المنفذ الذي تم استخدامه, يمكنك الاستعلام من المقبس بعد ذلك تم ملزمة محليا.

هنا هو ما أقوم به:تبدأ مع منفذ عشوائي في مجموعة 1025-2000 (مجموعة اختيار تعسفي).حاولت ربط وإذا فشل أمسك استثناء.ثم أذهب منفذ واحد حتى (port = port % 2000 + 1025) حتى أنا التفاف.أنا لا ميناء لا بد أنا أستسلم الفشل في الاختبار.

4 سنوات..في هذا اليوم لدينا الحل, وضع ListenUriMode إلى Unique, كما ذكر من MSDN

هنا مثال من نقطة نهاية التكوين

<endpoint address="service"
          binding="netTcpBinding"
          contract="Iservice"
          name="TcpBinding"
          bindingConfiguration="netTcpBindingNoSec"
          listenUriMode="Unique"
          />

و الآن المشكلة التالية:إذا كان المنفذ الحيوي كيف يمكن أن العملاء يعرفون ذلك ؟ كما جاء في هذا الجواب يمكنك استخدام WCF اكتشاف:أنه يتطلب القليل من التكوين على كل من الخادم و العميل لكنه يعمل بشكل جيد (مع المشكلة الوحيدة أن يستغرق بعض الثواني للحصول عليه ، بشكل افتراضي 20 ثانية ولكن ليس لدي أي مشاكل مما اضطرها إلى 5)

عند استخدام منفذ عالية عشوائي يمكنك توليد التصادم مع خادم آخر العمليات التي تريد أن تبدأ بعد البرنامج.مجرد استخدام الصفر رقم المنفذ والسماح os يهتمون التحفظات (/etc/services على unix, لا أعرف كيف يتعامل مع ويندوز عليه).

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