1

二重接続の小さなwcfサービスがあり、クライアント側でコールバックされるメソッドがなく、代わりにイベントが発生するようにしたいとします。次に、コードを再構築する方法。私のコードは次のとおりです。

サーバーエンド

namespace CommonParts
{
[ServiceContract(Namespace = "rf.services", 
    CallbackContract = typeof(IDataOutputCallback), 
    SessionMode = SessionMode.Required)]
public interface IServerWithCallback
{
    [OperationContract(IsOneWay=true)]
    void StartDataOutput(string msg);
}


public interface IDataOutputCallback {
    [OperationContract(IsOneWay = true)]
    void SendDataPacket(string data);
}
}

namespace RF.WCF.Callback.Server
{
class ServerWCallbackImpl : IServerWithCallback
{
    #region IServerWithCallback Members

    public void StartDataOutput(string msg)
    {
        //OperationContext.Current.
        IDataOutputCallback callback = OperationContext.Current.GetCallbackChannel<IDataOutputCallback>();
        for (int i = 0; i < 10; i++)
        {
            Random r = new Random();
            int interval = r.Next(500,3000);
            System.Threading.Thread.Sleep(interval);
            //callback.SendDataPacket("Packet " + i.ToString());
            callback.SendDataPacket("Hello " + msg);
        }
        callback.SendDataPacket("Last packet is this one :)");
    }
    #endregion
}
}

class Program
{
    static void Main(string[] args)
    {
        var myBinding = new NetTcpBinding(SecurityMode.None);
        ServiceHost duplex = new ServiceHost(typeof(ServerWCallbackImpl));
        duplex.AddServiceEndpoint(typeof(IServerWithCallback),
            myBinding,
            "net.tcp://192.168.1.2:9080/DataService");
        duplex.Open();
        Console.WriteLine("Host is running, press <ENTER> to exit.");
        Console.ReadLine();
        duplex.Close();
    }
}

クライアントエンド

class CallbackImpl : IDataOutputCallback

{#regionIDataOutputCallbackメンバー

public void SendDataPacket(string data)
{
  Console.WriteLine("Server sent: {0}", data);
}

#endregion

}

static void Main(string[] args)
{
    var myBinding = new NetTcpBinding(SecurityMode.None);
  DuplexChannelFactory<IServerWithCallback> cf =
          new DuplexChannelFactory<IServerWithCallback>(
              new CallbackImpl(),
              myBinding,
              new EndpointAddress("net.tcp://192.168.1.2:9080/DataService")); 
  IServerWithCallback srv = cf.CreateChannel();
  Console.Write("Enter Value... ");
  srv.StartDataOutput(Console.ReadLine());
  Console.WriteLine("Start");
  Console.ReadLine();
}

この以下の行がsrv.StartDataOutput(Console.ReadLine())と呼ばれるクライアント側から実行される場合。

次に、StartDataOutput()関数が呼び出され、この関数から、callback.SendDataPacket( "Hello" + msg);というコールバック関数が呼び出されます。次に、SendDataPacket()関数がクライアント側で呼び出されます。

だから私の質問は、コールバック関数の代わりにクライアント側でイベントをトリガーするにはどうすればよいですか?

4

1 に答える 1

0

イベント駆動型WCF非同期サービスの優れたチュートリアルは、CodeProjectにあります それはあなたがする必要があることについてあなたに良いスタートを切るはずです。この例で行われた重要なステートメントの1つは、プロセスがコールバック呼び出しを行うこととそれほど変わらないということです。:)

于 2012-10-30T19:10:07.183 に答える