110,536
社区成员
发帖
与我相关
我的任务
分享
namespace Server
{
class Program
{
// 启动服务器
static void Main(string[] args)
{
ServiceHost serviceHost = new ServiceHost(typeof(StockService));//, new Uri("http://localhost:8000/EssentialWCF"));
//serviceHost.AddServiceEndpoint(typeof(IStockService), new BasicHttpBinding(),"");
/*
ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
behavior.HttpGetEnabled = true;
serviceHost.Description.Behaviors.Add(behavior);
serviceHost.AddServiceEndpoint
(typeof(IMetadataExchange),
MetadataExchangeBindings.CreateMexHttpBinding(),
"mex");
*/
serviceHost.Open();
Console.WriteLine("Press <Enter> to terminate. \n\n");
Console.ReadLine();
serviceHost.Close();
}
}
}
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="Server.StockService"
behaviorConfiguration="MEXServiceTypeBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/EssentialWCF"/>
</baseAddresses>
</host>
<endpoint address="mex"
binding="basicHttpBinding"
contract="Server.IStockService"/>
<endpoint address = "mex"
binding = "wsDualHttpBinding"
contract = "IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MEXServiceTypeBehavior">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
/*********************************************************************************/
namespace Server
{
class StockService : IStockService
{
public static Hashtable workerTable = new Hashtable();
public double GetPrice(string ticker)
{
return 94.58;
}
public void RegisterForUpdates(string ticker)
{
Worker w = null;
if (!workerTable.ContainsKey(ticker))
{
w = new Worker();
w.ticker = ticker;
w.workerProcess = new Update();
w.workerProcess.ticker = ticker;
workerTable[ticker] = w;
Thread t = new Thread( new ThreadStart(w.workerProcess.SendUpdateToClient));
t.IsBackground = true;
t.Start();
}
w = (Worker)workerTable[ticker];
IClientCallBack c = OperationContext.Current.GetCallbackChannel<IClientCallBack>();
lock (w.workerProcess.callbacks)
w.workerProcess.callbacks.Add(c);
}
}
}
/*********************************************************************************/
namespace Server
{
[ServiceContract(CallbackContract = typeof(IClientCallBack))]
public interface IStockService
{
[OperationContract]
double GetPrice(string ticker);
}
public interface IClientCallBack
{
[OperationContract(IsOneWay = true)]
void PriceUpdate(string ticker, double price);
}
}
/*********************************************************************************/
namespace Server
{
public class Update
{
public string ticker;
public List<IClientCallBack> callbacks = new List<IClientCallBack>();
public void SendUpdateToClient()
{
Random w = new Random();
Random p = new Random();
while(true)
{
Thread.Sleep(w.Next(5000));
lock(callbacks)
foreach (IClientCallBack c in callbacks)
{
try
{
c.PriceUpdate("msft", 100.00 + p.NextDouble());
}
catch (Exception ex)
{
Console.WriteLine("Error sending cache to client:{0}", ex.Message);
}
}
}
}
}
}
/*********************************************************************************/
namespace Server
{
public class Worker
{
public string ticker;
public Update workerProcess;
}
}