2012-01-31 9 views
0

私は1つのwcfデュプレックスサービスと2つのクライアントを持っています。シナリオは、クライアント1がwcfに要求を送信し、wcfがそれをDBに保管するシナリオです.client2はDBから取得した要求を処理し、その状態をwcfサービスに送信してクライアント1に状況を通知する必要があります。 client1のコールバックアドレスは静的変数に格納されます.client2はwcfに通知しますが、wcfはclient1に通知しません。任意のソリューションpls。 事前のおかげでwcf wsdualhttpbindingでコールバッククライアントが動作しない

service.cs:

public class Service1 : IService1 
    { 
     static List<IServiceCallback> list = new List<IServiceCallback>(); 
     static IServiceCallback Callbck; 

     public bool GetData(int value) 
     { 
      int i = 0; 
      string s= string.Format("You entered: {0}", value); 
      Callbck = OperationContext.Current.GetCallbackChannel<IServiceCallback>(); 

      i++; 
      list.Add(Callbck); 
      Ret("sss..."); 
      return true; 
     } 

     public void Ret(string s) 
     { 

      foreach (var c in list) 
      { 

       Callbck.display(s); 
          } 
     } 

      } 

client1.cs:

class Program 
    { 

     static void Main(string[] args) 
     { 
             InstanceContext instance = new InstanceContext(new Handler()); 
       Service1Client client = new Service1Client(instance); 


           bool res = client.GetData(123); 

       if (res) 
        Console.WriteLine("true"); 


        } 
    } 
    public class Handler :IService1Callback 
    { 
     public void display(string s) 
     { 
      Console.WriteLine(s); 

     } 


    } 

client2.cs:

class Program 
    { 
     static void Main(string[] args) 
     { 
      int i = 0; 
      i++; 
         Display(); 
     } 

     public static void Display() 
     { 
      Console.WriteLine("hello"); 
      InstanceContext context = new InstanceContext(new Handlerss()); 
      Service1Client client = new Service1Client(context); 

      client.Ret("done"); 


     } 
    } 

    class Handlerss : IService1Callback 
    { 
     public void display(string s) 
     { 
      Console.WriteLine(s); 
     } 
    } 
+0

私はDbに保存するという私の実際のシナリオは含まれていません。この例で同じprobが発生しましたので、このコードを投稿してください – sow

+0

これらは同じマシンで実行されていますか、別のマシンで実行されていますか? –

+0

はい。両方ともinstancecontextmode = singleに設定しても、同じマシン上にあります – sow

答えて

0

私はあなたのサービスのための任意のInstanceContextMode・セットを参照してくださいいけません?あなたはあなたが望むようにあなたのアプリケーションを動作させるためにシングルを設定する必要があります。それ以外の場合は両方のクライアントが新しいサービスを取得します。

デバッグ用に、次のサービスをサービスに追加できます。クライアントコールバックチャネルが閉じられたかフォールトされたかどうかを確認するだけです。

public bool GetData(int value) 
    { 
     int i = 0; 
     string s= string.Format("You entered: {0}", value); 
     var callback= OperationContext.Current.GetCallbackChannel<IServiceCallback>(); 

     ICommunicationObject obj = (ICommunicationObject)callback; 
     obj.Closed += SubscribedServiceClosed;//write log or console or something else 
     obj.Faulted += SubscribedServiceFaulted;//write log or console or something else 

     i++; 
     list.Add(callback); 
     Ret("sss..."); 
     return true; 
    } 
+0

それは動作しませんでした。 – sow

+0

私はNetTCpBindingを使用しています。多分あなたはwsdualhttpbindingのためのいくつかの情報を見つける - > http://stackoverflow.com/questions/59677/wsdualhttpbinding-for-duplex-callbacks – blindmeis

+0

コールバックチャネルが閉じられていないかfaulted.Iは、 – sow

関連する問題