十五天精通WCF——第八天 對“繫結”的最後一點理解

一線碼農發表於2015-06-29

  

  轉眼已經中斷10幾天沒有寫部落格了,也不是工作太忙,正好碰到了端午節,然後最近看天津臺的愛情保衛戰入迷了。。。太好看了,一直都是回味無窮。。。而且

塗磊老師話說的真是tmd的經典,然後就這樣耽擱了,好了,話不多說,這篇我們看看binding中最後一點需要知道的東西。

 

一:通道棧

  我在之前的文章中多次提到通道棧,不知道大家對它的概念是否有了解,其實想想也還是蠻簡單的,既然是棧,那麼這個棧肯定就不止一個元素了,對吧,第二個

的話,既然是棧,那麼肯定就遵循FILO的原則,可能你會說,這個還是蠻抽象的,能給個具體的例子麼???恭喜你,wcf中還真有一個方法CreateBindingElements,

下面我們具體看看。。。

 

1.  簡單看看各種binding的棧中都有些什麼

  

看到上面的監控視窗,是不是有點意思,在BasicHttpBinding的通道棧中有兩個元素,分別是HttpTransportBindingElement和TextMessageEncodingBindingEl

ement,通過名字也能很容易的判斷出來,一個是“http傳輸協議”,一個是“文字訊息編碼協議”,然後再看看複雜一點的WSHttpBinding,你會發現,他不光有Basic

的所有東西,還包括SymmetricSecurityBindingElement(安全協議) 和 TransactionFlowBindingElement(事務流),現在你心中是不是有底了,起碼我知道各

種Binding裡面都有些啥,為了更好的理解,我來畫一張簡圖。

上面這個圖,大概也就表達了我的意思,當我們Client在走WSHttpBinding這個協議的時候,Client端的InputMessage會先走 TransactionFlow,SymmetricSec

urity,TextMessageEncoding,最後走HttpTransport,然後Service端就按照客戶端進行“反向處理”,通過一陣禁臠之後,我們就拿到了安全的OutputMessage。

 

二:BindingElement的跨繫結性

  你要是很仔細的話,你肯定會發現,其實Binding就是一個預先預設配置好的通道棧,對不對,你也看到了,每一種Binding都有屬於自己的BindingElements,

恰恰這些Elements是可以跨Binding的,也就是說我可以自由組合Elements,這樣是不是可以給我們這些寒酸的碼農最大的靈活性,對吧,舉個簡單的例子,

BasicHttpBinding有兩個繫結元素,其中對soap訊息進行的是TextMessageEncoding編碼對吧,而netTcpBinding對soap進行的BinaryMessageEncoding,

然後你也應該知道了,我想做一個自定義的Binding,其中訊息編碼是BinaryMessage,傳輸協議是HttpTransport,那怎麼做呢????

Host檔案:

 1     class Program1
 2     {
 3         static void Main(string[] args)
 4         {
 5             ServiceHost host = new ServiceHost(typeof(HomeService), new Uri("http://192.168.1.105:1920"));
 6 
 7             var customBinding = new CustomBinding();
 8 
 9             customBinding.Elements.Add(new BinaryMessageEncodingBindingElement());
10             customBinding.Elements.Add(new HttpTransportBindingElement());
11 
12             host.AddServiceEndpoint(typeof(IHomeService), customBinding, "HomeServie");
13 
14             host.Description.Behaviors.Add(new ServiceMetadataBehavior() { HttpGetEnabled = true });
15 
16             host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
17 
18             host.Open();
19 
20             Console.WriteLine("服務已經開啟!!!");
21 
22             Console.Read();
23         }
24     }

 

Client呼叫:

 1     static void Main(string[] args)
 2         {
 3             ServiceReference1.HomeServiceClient client = new ServiceReference1.HomeServiceClient();
 4 
 5             var result = client.Update("你好");
 6 
 7             Console.WriteLine("server value:" + result);
 8 
 9             Console.Read();
10         }

最後我們用Fiddler監視一下,最後我們看看,都是些亂碼。

 

這篇就說到這裡了,希望對你有幫助,下一篇我們看看WCF中的Behavior,很好玩的哦~~~

 

相關文章