WCF客戶端處理詳細步驟解析
WCF框架的的功能比較強大,對于開發(fā)人員來說,是一款非常有用的開發(fā)框架??梢詭椭覀儗崿F(xiàn)跨平臺的高可靠性的解決方案。在這里就先了解一下WCF客戶端處理的一些相關(guān)步驟。#t#
WCF,在客戶端自動生成的實例中 是從ClientBase<of T>.Channel屬性開始的,最終要創(chuàng)建T的透明代理,然后調(diào)用。
以BasicHttpBinding為例,WCF客戶端處理的主要步驟如下:
1 根據(jù)傳入的Binding和EndpointAddress生成ServiceEndpoint
2 再根據(jù)ServiceEndpoint的類型生成ServiceChannelFactory 類的實例 ,當(dāng)前BasicHttpBinding 生成的應(yīng)該是ServiceChannelFactoryOverRequest類的實例, 對應(yīng)的IChannelBinder是RequestChannelBinder 。
注:
basicHttpBinding.BuildChannelFactory<IRequestChannel>要對 basicHttpBinding所有的綁定元素進行遍歷。默認情況下,不啟用https,則傳輸元素使用HttpTransportBindingElement,該對象重寫B(tài)uildChannelFactory<IRequestChannel>,返回值是HttpChannelFactory 。
RequestChannelBinder對象最重要的字段是channel,對應(yīng)的值是HttpChannelFactory.CreateChannel(),返回的值是HttpChannelFactory.HttpRequestChannel 。
3 生成ServiceChannel,將ServiceChannelFactoryOverRequest和RequestChannelBinder做為參數(shù)傳入ServiceChannel
構(gòu)造函數(shù)為ServiceChannel(ServiceChannelFactory factory, IChannelBinder binder)
4. 生成T的透理代理ServiceChannelProxy,將ServiceChannel做為參數(shù)傳入ServiceChannelProxy,構(gòu)造。
5.在調(diào)用透明代理相應(yīng)的方法時,調(diào)用ServiceChannelProxy.Invoke(), 如果是Service,調(diào)用ServiceChannel.Call(),此時實質(zhì)是調(diào)用ServiceChannel封裝的IChannelBinder(當(dāng)前是RequestChannelBinder)的call。
6 調(diào)用RequestChannelBinder.Request(),注意步驟2***一句,此時channel是HttpChannelFactory.HttpRequestChannel
HttpChannelFactory.HttpRequestChannel創(chuàng)建 HttpChannelRequest的請求,然后調(diào)用HttpChannelRequest.SendRequest發(fā)送消息 ,其實質(zhì)就是封裝一個HttpWebRequest,將Message發(fā)送到服務(wù)器端address里,根,webservice的最終原理是一樣的。
因此,要抓住幾個關(guān)系點,從總體上把握WCF客戶端處理的流程
(1 ServiceChannelFactory 類的實例是什么類型
(2 IChannelBinder接口的實現(xiàn)是什么類型
(3 IChannelBinder.Channel是什么
BindingElement.BuildChannelFactory<TChannel>這個方法很有意思,默認的實現(xiàn)是通用BindingContext。將當(dāng)前Binding對象中的所有元素(BindingElementCollection對象的實例),one by one 的進行遍歷,每次移走一個,取出,然后再次調(diào)用BuildChannelFactory<TChannel>
協(xié)議通道元素 (安全)
BasicHttpSecurity security;
配置 basicHttpBinding 綁定的安全設(shè)置。
消息編碼綁定元素
MtomMessageEncodingBindingElement mtomEncoding;
指定消息傳輸優(yōu)化機制 (MTOM) 消息所使用的編碼和版本管理的綁定元素。
TextMessageEncodingBindingElement textEncoding;
指定用于基于文本的 SOAP 消息的字符編碼與消息版本管理。
此時,BindingElementCollection中有以上元素,先從集合中移出一個,
調(diào)用一次BuildChannelFactory<TChannel>
HttpTransportBindingElement httpTransport 重寫了BuildChannelFactory<TChannel> 返回 HttpChannelFactory
其它的綁定元素基本上調(diào)BindingElement的,是直接跳到下一個。
所以, BasicHttpBinding.BuildChannelFactory<IRequestChannel>()返回的是HttpChannelFactory 。
以上就是WCF客戶端處理全部步驟介紹。