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标签:双工,string,void,System,契约,new,ticker,public,客户端 From: https://blog.51cto.com/u_15870687/5837408
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();
}
}
}
}