1、定义服务器端
代码;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace Contract
{
[ServiceContract(CallbackContract=typeof(IClientCallback))]
public interface IServerStock
{
[OperationContract(IsOneWay = true)]
void RegisterForUpdates(string ticker);
}
public interface IClientCallback
{
[OperationContract(IsOneWay = true)]
void PriceUpdate(string ticker, double price);
}
public class ServerStock : IServerStock
{
//This is NOT a good notification algorithm as it's creating
//one thread per client. It should be inverted so it's creating
//one thread per ticker instead.
public void RegisterForUpdates(string ticker)
{
Update bgWorker = new Update();
bgWorker.callback = OperationContext.Current.GetCallbackChannel<IClientCallback>();
Thread t = new Thread(new ThreadStart(bgWorker.SendUpdateToClient));
t.IsBackground = true;
t.Start();
}
}
public class Update
{
public IClientCallback callback = null;
public void SendUpdateToClient()
{
Random p = new Random();
for (int i = 0; i < 10; i++)
{
Thread.Sleep(5000); //updates occurs somewhere
try
{
callback.PriceUpdate("msft", 100.00 + p.NextDouble());
}
catch (Exception ex)
{
Console.WriteLine("Error sendinig cache to client:{0}", ex.Message);
}
}
}
}
}
配置文件:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <service behaviorConfiguration="MEXServiceTypeBehavior" name="WCFTest.ServerStock"> <endpoint address="" binding="wsDualHttpBinding" contract="WCFTest.IServerStock" /> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> <host> <baseAddresses> <add baseAddress="http://DL00549-990:8000" /> </baseAddresses> </host> </service> </services> <behaviors> <serviceBehaviors> <behavior name="MEXServiceTypeBehavior"> <serviceMetadata httpGetEnabled="true"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
2、定义客户端
namespace Client { public class CallbackHandler : IServerStockCallback { static InstanceContext site = new InstanceContext( new CallbackHandler()); static ServerStockClient proxy = new ServerStockClient(site); public void PriceUpdate( string ticker, double price) { Console.WriteLine( " Received alert at : {0}. {1}:{2} " ,System.DateTime.Now, ticker, price); } class Program { static void Main( string [] args) { proxy.RegisterForUpdates( " MSFT " ); Console.WriteLine( " Press Enter or any key to exit " ); Console.ReadLine(); } } } }