通过了解了WCF的一些基本概念并创建和编写WCF应用中的相应方法,实现了WCF服务和客户端之间的调用,就能够理解WCF应用是如何进行通信的。了解了一些基本的WCF概念后,还需要深入了解WCF消息的概念。
18.4.1 消息传递
客户端与服务器之间是通过消息进行信息通信的,通过使用消息,客户端和服务器之间能够通过使用消息交换来实现方法的调用和数据传递。
1.Request/Reply消息传递模式
Request/Reply模式是默认的消息传递模式,该模式调用服务器的方法后需要等待服务的消息返回,从而获取服务器返回的值。Request/Reply模式是默认模式,在声明时无需添加其模式的声明,示例代码如下所示。
string GetShopInformation(string address);//默认模式
上述代码就使用了一个默认的Request/Reply模式进行消息传递,GetShopInformation方法同样需要实现,示例代码如下所示。
{
if (address == "武汉")//判断地址
{
return "武汉麦当劳连锁店";//返回相应结果
}
else if (address == "北京")//判断地址
{
return "北京麦当劳连锁店";//返回相应结果
}
else if (address == "上海")//判断地址
{
return "上海麦当劳连锁店";//返回相应结果
}
else
{
return "没有该连锁店";//返回默认结果
}
}
GetShopInformation方法返回一个string的值给客户端,客户端调用服务器的方法时,首先会向服务器发送消息,以告诉服务器客户端需要调用一个方法,当服务器接收消息后会返回消息给客户端。在这一段过程中,客户端会等待服务器端的相应,当客户端接受到服务器的相应后,则会呈现在客户端应用程序中。如图18-12所示。
图18-12 Request/Reply模式
2.One-way消息传递模式
One-way模式和Request/Reply模式不同的是,如果使用One-way模式定义一个方法,该方法被调用后会立即返回。使用One-way模式修饰的方法必须是void方法,如果该方法不是void修饰的方法或者包括out/ref等参数,则不能使用One-way模式进行修饰,示例代码如下所示。
void OutputString();//定义方法
该方法使用了One-way模式,则不能有参数的输出,只允许void关键字修饰该方法,OutpuString方法的具体实现如下所示。
{
Console.WriteLine("IsOneWay=true");
}
运行WCF应用后,执行OutpuString方法后结果如图18-13所示。
图18-13 One-way模式
WCF的消息传递模式不仅包括这两种模式,还包括duplex模式,duplex是WCF消息传递中比较复杂的一种模式,由于篇幅限制,本书不再进行详细的介绍。
18.4.2 消息操作
由于WCF的客户端和服务器之间都是通过消息响应和通信的,那么在WCF应用的运行过程中,消息是如何在程序之间进行操作的,这就需要通过XML文档来获取相应的结果。在客户端和服务器之间出现信息通信,并且客户端调用了服务器的方法时,就会产生消息,如GetSum方法。GetSum方法在接口中的代码如下所示。
int GetSum(DateTime time);//定义方法
在GetSum方法的实现过程中,只需要进行简单的操作即可,示例代码如下所示。
{
int BreadNum = 10;//声明必要字段
int Milk = 5; //声明必要字段
int HotDryNuddle = 20;//声明必要字段
int today = BreadNum + Milk + HotDryNuddle;//实现计算
return today; //返回值
}
上述代码执行后,客户端会调用服务器的GetSum方法,服务器接受响应再返回给客户端相应的值,如图18-14和图18-15所示。
图18-14 执行服务器方法
图18-15 返回的XML格式文档
在运行后,测试客户端能够获取请求时和响应时的XML文档,其中请求时产生的XML文档如下所示。
从上述代码可以看到在Action节中,使用了相应的方法GetSum,在WCF服务库编程中可以通过使用OperationContract.Action捕获相应的Action消息,示例代码如下所示。
Message MyProcessMessage(Message m);
MyProcessMessage实现示例代码如下所示。
{
CompositeType t = m.GetBody<CompositeType>();//获取消息
Console.WriteLine(t.StringValue);//输出消息
return Message.CreateMessage(MessageVersion.Soap11,
"Add", new CompositeType("Hello World!"));//返回消息
}
上述代码将操作转换为消息后发送,开发人员可以通过Windows应用程序或ASP.NET应用程序获取修改后消息的内容。在进行消息的操作时,WCF还允许开发人员使用 MessageContractAttribute / MessageHeaderAttribute 来控制消息格式,这比 DataContractAttribute 要更加灵活。