二重接続の小さな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()関数がクライアント側で呼び出されます。
だから私の質問は、コールバック関数の代わりにクライアント側でイベントをトリガーするにはどうすればよいですか?