WCF 之 通過綁定進(jìn)行消息通信
來源:程序員人生 發(fā)布時(shí)間:2015-05-25 09:14:25 閱讀次數(shù):2630次
WCF可以分成兩個(gè)部份:服務(wù)模型層(Service Model Layer)和信道層(Channel Layer).服務(wù)模型層建立在信道層之上,提供了1個(gè)統(tǒng)1的、可擴(kuò)大的編程模型。信道層則通過綁定創(chuàng)建的信道棧為消息通訊提供了1個(gè)傳輸、處理的通道。
綁定與信道棧(Binding and Channel Stack)
綁定,在WCF全部結(jié)構(gòu)體系中扮演著中間人的角色。當(dāng)服務(wù)被成功寄宿時(shí),WCF通過終結(jié)點(diǎn)的綁定對(duì)象創(chuàng)建1個(gè)或多個(gè)信道監(jiān)聽器(ChannelListener),綁定到監(jiān)聽端口進(jìn)行要求的偵聽。當(dāng)要求消息抵達(dá),則利用信道監(jiān)聽器創(chuàng)建的信道棧進(jìn)行消息的接收。服務(wù)操作履行的結(jié)果終究封裝到回復(fù)消息中,通過相同的信道棧被回送。在客戶端,通過綁定創(chuàng)建信道工廠(ChannelFactory),借助信道工廠創(chuàng)建的信道棧進(jìn)行要求消息的發(fā)送與回復(fù)消息的接收。
下面我們就具體來看1個(gè)通過綁定進(jìn)行消息通訊的實(shí)例
1、創(chuàng)建全部解決方案
MessageViaBinding.Listener:1個(gè)控制臺(tái)利用程序,摹擬消息的監(jiān)聽方。
MessageViaBinding.Sender:1個(gè)控制臺(tái)利用程序,摹擬消息的發(fā)送方。

2、創(chuàng)建監(jiān)聽端利用程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Text;
using System.Runtime.Serialization;
namespace MessageViaBinding.Listener
{
class Program
{
static void Main(string[] args)
{
Uri listenUri = new Uri("http://localhost:8008/listener");
//創(chuàng)建BasicHttpBinding對(duì)象
Binding binding
= new BasicHttpBinding();
//創(chuàng)建信道監(jiān)聽器對(duì)象,listenUri為監(jiān)聽地址
IChannelListener<IReplyChannel> channelListener = binding.BuildChannelListener<IReplyChannel>(listenUri);
//打開信道監(jiān)聽器對(duì)象
channelListener.Open();
//創(chuàng)建信道棧進(jìn)行要求的監(jiān)聽
IReplyChannel channel = channelListener.AcceptChannel(TimeSpan.MaxValue);
channel.Open();
Console.WriteLine("開始監(jiān)聽...");
while (true)
{
RequestContext requestContext = channel.ReceiveRequest(TimeSpan.MaxValue);
Console.WriteLine("接收到要求消息:
{0}", requestContext.RequestMessage);
requestContext.Reply(CreateReplyMessage(binding));
}
}
//創(chuàng)建回復(fù)消息
static Message CreateReplyMessage(Binding binding)
{
string action = "urn:artech.com/reply";
string body = "這是1個(gè)簡(jiǎn)單的回復(fù)消息!";
return Message.CreateMessage(binding.MessageVersion, action, body);
}
}
}
3、創(chuàng)建發(fā)送端利用程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Text;
namespace MessageViaBinding.Sender
{
class Program
{
static void Main(string[] args)
{
Uri listenUri = new Uri("http://localhost:8008/listener");
//創(chuàng)建BasicHttpBinding對(duì)象
Binding binding
= new BasicHttpBinding();
IChannelFactory<IRequestChannel> channelFactory = binding.BuildChannelFactory<IRequestChannel>();
channelFactory.Open();
IRequestChannel channel = channelFactory.CreateChannel(new EndpointAddress(listenUri));
channel.Open();
Message replyMessage = channel.Request(CreateRequestMessage(binding));
Console.WriteLine ("接收到回復(fù)消息
{0}",replyMessage);
Console.Read();
}
//創(chuàng)建要求消息
static Message CreateRequestMessage(Binding binding)
{
string action = "urn:artech.com/request";
string body = "這是1個(gè)簡(jiǎn)單的要求消息!";
return Message.CreateMessage(binding.MessageVersion, action, body);
}
}
}
啟動(dòng)監(jiān)聽端

啟動(dòng)發(fā)送端發(fā)送要求消息,監(jiān)聽端就可以馬上監(jiān)聽到該要求消息

同時(shí),監(jiān)聽端發(fā)送回復(fù)消息,發(fā)送端接收到該回復(fù)消息

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)