由于也是入门,所以对于刚入门的学习者来说,这个案例更简洁。废话不多,直接看例子即可:
四个项目:不做介绍,入门也看得懂
第一步服务端和接口:
服务端定义了两个接口:一个是给服务提供的,另一个是回调函数的接口
/// <summary>
///
/// CallbackContract对应定义的回调类型
/// </summary>
[ServiceContract(Namespace="http://www.artech.com/",
CallbackContract = typeof(ICallback))]
public interface ICalculator
{
/// <summary>
/// IsOneWay=true 定义为单项操作,客户端仅仅是向服务端发送一个运算的请求,并不会通过回复消息得到任何运算结果。
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
[OperationContract(IsOneWay=true)]
void Add(double x, double y);
}
回调接口定义:
public interface ICallback
{
/// <summary>
/// 由于服务端不需要回调的返回值,索性将回调操作也设为单向方法.
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <param name="result"></param>
[OperationContract(IsOneWay=false)]
void DisplayResult(double x, double y, double result);
}
服务定义:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
public class CalculatorService : ICalculator
{
public void Add(double x, double y)
{
double result = x + y;
Console.WriteLine("客户端执行了Add方法"+DateTime.Now.ToString());
ICallback callback = OperationContext.Current.GetCallbackChannel<ICallback>();
callback.DisplayResult(x, y, result);
}
}
第二部:服务寄宿
用最简单的寄宿方式,不逼逼
1、配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="Services.CalculatorService">
<endpoint address="http://127.0.0.1:9999/CalculatorService"
binding="wsDualHttpBinding"
contract="Contracts.ICalculator"
name="CalculatorService"/>
</service>
</services>
</system.serviceModel>
</configuration>
2、main方法:
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
{
Console.WriteLine("启动成功");
host.Open();
Console.Read();
}
}
第三部:客户端实现
1、客户端要重写回调:
class CalculateCallback : ICallback
{
public void DisplayResult(double x, double y, double result)
{
Console.WriteLine("x + y = {2} when x = {0} and y = {1}", x, y, result);
}
}
2、客户端配置
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<client>
<endpoint name="CalculatorService" address="http://127.0.0.1:9999/CalculatorService"
contract="Contracts.ICalculator" binding="wsDualHttpBinding"></endpoint>
</client>
</system.serviceModel>
</configuration>
3、客户端main
static void Main(string[] args)
{
//初始化一个上线文实例,参数是一个回调函数
InstanceContext instanceContext = new InstanceContext(new CalculateCallback());
//创建双工通道类
using (DuplexChannelFactory<ICalculator> channelFactory = new DuplexChannelFactory<ICalculator>(instanceContext, "CalculatorService"))
{
//创建通道
ICalculator proxy = channelFactory.CreateChannel();
using (proxy as IDisposable)
{
proxy.Add(1, 2);
Console.Read();
}
}
}
结果: