سؤال

أنا تصميم العميل-الخادم تطبيق الدردشة (في الواقع أنا لا, ولكن دعونا نتظاهر أنا:)) و أنا في حيرة قليلا قبل بعض شروط السباق كنت من ذوي الخبرة.

دعونا نقول لدي البرمجية التالية:

public interface IServer
{
  [OperationContract(IsOneWay = false)]
  [FaultContract(typeof(ChatException))]
  void BroadcastMessage(string msg);
}

public class Server : IServer 
{
  void BroadcastMessage(string msg) // I'm not mentionning the try/catch/throw FaultException here for readability purposes
  {
    foreach (IClientCallback c in callbacks){
      c.ReceiveMessage(msg);
    }

  }
}

public interface IClientCallback
{
  [OperationContract(IsOneWay = true)]
  void ReceiveMessage(string s);
}

وهنا مقتطف من ربط التكوين :

<endpoint address="" 
binding="netTcpBinding" 
bindingConfiguration="DuplexBinding" 
contract="IServer" />

 <binding name="DuplexBinding" sendTimeout="00:01:00">
   <reliableSession ordered="true" inactivityTimeout="00:05:00" enabled="true"/>
   <security mode="None">
     <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
     <message clientCredentialType="Windows" />
   </security>
 </binding>

وهذا بالطبع نوع من الزائفة c#, لقد أزلت الكثير من غير ذات الصلة رمز الوضوح أجل.

الآن إلى النقطة :هذا الكود لن يعمل.عندما اتصل BroadcastMessage ، فإن هذه الطريقة لا يعود أبدا و أنا في نهاية المطاف الحصول على مهلة من جانب العميل.إذا كنت التصحيح على جانب الملقم ، كل شيء يبدو على ما يرام (أنا عائد من BroadcastMessage الطريقة بالضبط كما هو متوقع, و أنا لا حظر على أي ReceiveMessage طريقة واحدة المكالمات)

هنا طريقتان لإصلاح هذا الكود :

  1. إزالة FaultContract وتعلن BroadcastMessage طريقة تسير في اتجاه واحد=true
  2. بث الرسالة إلى الجميع ولكن الأولي المرسل

تخميني الأول هو أن العميل كان في انتظار الخادم العودة ، وبالتالي لم تكن متوفرة من أجل التعامل مع الوافدين ReceiveMessage الاتصال من الملقم ، وبالتالي عرقلة الخادم ، ولكن ReceiveMessage أعلن تسير في اتجاه واحد, و التصحيح الخادم يدل على أن ذلك لا يمنع على أي دعوة إلى ReceiveMessage

الآن أسئلتي :

  • ماذا يجري ؟

  • هل هناك طرق أخرى لإصلاح هذا ؟ (ربما عن طريق ضبط وربط التكوين؟)

  • دعونا نقول أنا أختار إصلاح 2 (أي لا البث مرة أخرى إلى المرسل) ماذا يحدث إذا كان الملقم المكالمات بلدي ReceiveMessage رد (لأن شخص آخر أرسل لي رسالة) بينما أنا في انتظار بلدي BroadcastMessage الدعوة إلى النهاية ؟

  • لقد قرأت أن تسير في اتجاه واحد المكالمات ليست تماما تسير في اتجاه واحد, وهذا الخادم لا يزال ينتظر HTTP استجابة من الجانب الآخر.أي تفاصيل عن هذا ؟ على وجه التحديد, هو العميل قادرا على الاستجابة suche http الردود عندما منعت في مكان بعيد المكالمة ؟

تحرير:وحدة التحكم .net framework 3.5 على جانب الملقم ، Winforms .net framework 3.5 على جانب العميل

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

المحلول

يبدو طريق مسدود ، ربما بسبب تزامن السياق.ما هو العميل ؟ Winform?WPF?WCF النواحي sync-السياق الذي يعني "التبديل إلى UI" على winforms و WPF.إذا كنت مما يجعل حجب الطلب على UI ، ثم أكثر من لعبة.

حاول أداء WCF الطلب على خلفية الموضوع ، بحيث UI تتوفر خدمة واردة الطلب ؛ وهذا يمكن أن تكون بسيطة مثل استخدام ThreadPool, أو ربما BackgroundWorker.

نصائح أخرى

حاول إضافة هذه السمة الخاصة بك ملموسة تنفيذ الخدمة الخاص بك:

[System.ServiceModel.ServiceBehavior(UseSynchronizationContext=false)]
public class Server : IServer {}

ثانيا: محاولة تشغيل WCF تتبع لمعرفة ما إذا كان لديك شيء ما يحدث في أحشاء الخاص بك WCF التنفيذ الذي هو إعطاء الخاص بك الحزن.لقد كان بعض غريب حقا الأخطاء التي من المنطقي عندما ذهبت إلى تتبع وجدت الفعلية رسالة الخطأ التي كانت تحدث.

تتبع خدمة WCF

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