首页 > 其他分享 >服务契约(双工契约的服务器与客户端实现案例)

服务契约(双工契约的服务器与客户端实现案例)

时间:2022-11-09 17:31:28浏览次数:48  
标签:双工 string void System 契约 new ticker public 客户端


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();
}
}
}
}

标签:双工,string,void,System,契约,new,ticker,public,客户端
From: https://blog.51cto.com/u_15870687/5837408

相关文章