完成一个基本WCF实例,要求:
1. 使用 双工契约;
2. 使用 net.tcp 绑定方式;
3. 使用 ConsoleApplication 服务,若要使用IIS 请查阅《WCF服务使用netTcpBinding》;
1. 定义ServiceContract
定义服务端ServiceContract, ServiceContract 特性的构造方法中,指定CallbackContract 的类型
[ServiceContract(CallbackContract = typeof(IStockServiceCallback))]
public interface IStockService
{
[OperationContract]
double GetPrice(string ticker);
[OperationContract(IsOneWay = true)]
void RegisterForUpdate(string ticker);
}
public interface IStockServiceCallback
{
[OperationContract(IsOneWay = true)]
void PriceUpdate(string ticker, double price);
}
public class StockService : IStockService
{
public class Worker
{
public string ticker;
public Update workProcess;
}
public static Hashtable workers = new Hashtable();
#region IStockService Members
public double GetPrice(string ticker)
{
return 94.95;
}
public void RegisterForUpdate(string ticker)
{
Worker worker = null;
if (!workers.ContainsKey(ticker))
{
worker = new Worker();
worker.ticker = ticker;
worker.workProcess = new Update();
worker.workProcess.ticker = ticker;
workers.Add(ticker, worker);
}
worker = (Worker)workers[ticker];
IStockServiceCallback c = OperationContext.Current.GetCallbackChannel();
lock (worker.workProcess.callbacks)
{
worker.workProcess.callbacks.Add(c);
}
Thread t = new Thread(new ThreadStart(worker.workProcess.SendUpdateToClient));
t.IsBackground = true;
t.Start();
}
#endregion
}
public static void Host(Type type)
{
using (ServiceHost servcieHost = new ServiceHost(type))
{
ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
behavior.HttpGetEnabled = true;
servcieHost.Description.Behaviors.Add(behavior);
servcieHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
servcieHost.Opened += delegate
{
Console.WriteLine("{0}已启动,按键终止程序,", type.FullName);
};
servcieHost.Open();
Console.ReadLine();
servcieHost.Close();
}
}
svcutil net.tcp://localhost:809/StockService/mex /config:app.config /out:StockServiceProxy.cs /async