0

パブリッシャーとサブスクライバーのメカニズムを WCF で実装しました。

これは私がコールバックを購読する方法です:

public delegate void AsyncResponseEventHandler(AsyncResponse asyncResponse); 
public static event AsyncResponseEventHandler AsyncResponseEvent;       
public static IMyEvents Subscriber;        
public  void SubscribeEvent()        
{            
Subscriber = OperationContext.Current.GetCallbackChannel<IMyEvents>();            
AsyncResponseEvent += new AsyncResponseEventHandler (Subscriber.AsyncResponseCallBack);        
}         
public static void RaiseAsyncResponse(AsyncResponse asyncResponse)    
{         
   try 
           {                
        AsyncResponseEvent.Invoke(asyncResponse);
           }            
catch (Exception ex)  {throw;}    
}     

また、これは MySubscriber クラス コードです。

     public class MySubscriber : IMyEvents
    {


 public void AsyncResponseCallBack(AsyncResponse asyncResponse)
        {

            AsyncResponseEventArgs e = new AsyncResponseEventArgs()
            {
                Response = asyncResponse
            };
            OnAsyncResponseReceived(this, e);

        }
    }

RaiseAsyncResponse メソッドを使用して、クライアントへのコールバックを発生させます。

サービスホストがWindowsサービスで、サービスを開始してデバッグを開始すると、すべてが初めて正常に機能しますが、クライアントアプリケーションを停止して、Windowsサービスを再起動せずにデバッグを再開すると、例外に直面します:通信オブジェクト、System.ServiceModel.Channels.ServiceChannel、アボートされているため、通信に使用できません...

コールバック チャネルが中止されるのはなぜですか? 私を助けてください ... :(

4

1 に答える 1

1

「しかし、クライアントアプリケーションを停止すると」が答えだからです。クライアント アプリケーションを停止するとすぐに、System.ServiceModel はチャネルの保留を解除します。サービスまたはクライアントを強制終了した場合、サービスからクライアントにデータを送信することはできません。

于 2013-05-10T18:47:10.763 に答える