WCF服務(wù)如何獲得客戶端IP地址信息(轉(zhuǎn))http://www.cnblogs.com/cpcpc/archive/2011/02/17/2123062.html
今天新開(kāi)了一個(gè)系列文章《WCF熱門(mén)問(wèn)題編程示例》:主要是針對(duì)WCF里比較有價(jià)值的問(wèn)題的收集和整理,進(jìn)行分析和 編程實(shí)踐。最后會(huì)給出具體的示例代碼。這個(gè)系列的第一篇文章:WCF熱門(mén)問(wèn)題編程示例(1):WCF服務(wù)如何獲得客戶端IP地址信息。這個(gè)問(wèn)題是在 MSDN中文論壇一個(gè)網(wǎng)友xiaochong4提出的,原文是: 服務(wù)端通過(guò)getcallbackchannel可以取得回調(diào)的引用,對(duì)回調(diào)的調(diào)用肯定會(huì)有IP地址和端口的信息,有沒(méi)有辦法在服務(wù)端編程取得回調(diào)的endpoint信息.,查了好久資料沒(méi)查到,大俠指教下。 原文連接地址:http://social.microsoft.com/Forums/zh-CN/wcfzhchs/thread/07ce1e3d-eddf-481c-9026-48505732d7dc 【1】問(wèn)題分析: WCF服務(wù)能否獲取客戶端地址IP信息,這個(gè)問(wèn)題相信很多人都遇到過(guò)。而且很多人發(fā)愁找不到解決問(wèn)題的辦法。我們傳統(tǒng)的機(jī)遇Http Post/Get的網(wǎng)絡(luò)應(yīng)用和 Web Service都提供了獲取客戶端地址的信息的實(shí)現(xiàn)機(jī)制。而到了WCF,這樣一個(gè)獲取客戶端地址的功能實(shí)現(xiàn)起來(lái)卻是相當(dāng)復(fù)雜。早期的WCF沒(méi)有提供相應(yīng)的 支持。 現(xiàn)在Orcas也就是VS2008提供了實(shí)現(xiàn)機(jī)制,.NET3.5一起發(fā)布。 【2】資料收集: 【2.1】stswordman2007年整理的一個(gè)文章http://www.cnblogs.com/stswordman/archive/2007/05/31/699542.html。限于當(dāng)時(shí)的WCF的限制,他沒(méi)有找到解決辦法。而且也查找了國(guó)外的論壇,老外的建議也是不可以獲取客戶端地址信息,WCF當(dāng)時(shí)沒(méi)有提供這樣的特性支持。大家有興趣可以看看WCF英文技術(shù)論壇的帖子: 2.http://social.msdn.microsoft.com/forums/en-US/wcf/thread/3cf4aecf-4d15-44e0-8b62-a0811363091f/ 基本都是不能解決,這個(gè)受技術(shù)條件的限制,不是結(jié)論錯(cuò)誤?,F(xiàn)在一樣做個(gè)參考。這里也對(duì)stswordman的工作表示感謝,我后續(xù)會(huì)給出正確的代碼。 【2.2】后來(lái)收集的資料,Phil Henning's WebLog:http://blogs./phenning/archive/2007/08/08/remoteendpointmessageproperty-in-wcf-net-3-5.aspx.這個(gè)文章,提供的解決問(wèn)題的方法。 主要使用是.NET3.5里的服務(wù)端上下文的消息實(shí)例的RemoteEndpointMessageProperty屬性,獲取客戶端地址信息。但是限制 的綁定是HTTP、TCP相關(guān)的綁定協(xié)議。網(wǎng)絡(luò)通信的底層機(jī)制來(lái)說(shuō),數(shù)據(jù)包如果經(jīng)由TCP傳輸,IP數(shù)據(jù)包應(yīng)該包含地址和端口信息,這個(gè)我們網(wǎng)絡(luò)編程也可 以理解。但是WCF獲取客戶端地址信息早期卻沒(méi)提供相應(yīng)的實(shí)現(xiàn)。其實(shí)按照道理來(lái)說(shuō)沒(méi)什么難度。只是多做個(gè)數(shù)據(jù)包的解析工作,然后把地址信息包裝即可。 【3】示例代碼: 這里給出服務(wù)端獲取客戶端IP地址信息的示例代碼分析和實(shí)現(xiàn)過(guò)程,這里的測(cè)試主要是針對(duì)HTTP、TCP相關(guān)的協(xié)議做了4個(gè)測(cè)試。NamePipeBinding等協(xié)議不做測(cè)試了,本地協(xié)議不需要IP和端口。我們主要測(cè)試的是幾個(gè)主要的協(xié)議,來(lái)驗(yàn)證以上的結(jié)論。 【3.1】服務(wù)端: 主要是對(duì)RemoteEndpointMessageProperty屬性的使用來(lái)獲取地址、端口信息。具體代碼如下: //1.服務(wù)契約 【3.2】宿主:使用的是控制臺(tái)托管宿主方式,延續(xù)上一個(gè)些列的特色。大家很應(yīng)該很容易就上手了。簡(jiǎn)單介紹一下配置過(guò)程。 這里配置了HTPP和TCP相關(guān)的4個(gè)服務(wù)終結(jié)點(diǎn)進(jìn)行測(cè)試: <service behaviorConfiguration="WCFService.WCFServiceBehavior" 【3.3】客戶端:?jiǎn)?dòng)宿主和添加服務(wù)引用的過(guò)程就詳細(xì)介紹了。我們分別針對(duì)每個(gè)不同的服務(wù)終結(jié)點(diǎn),實(shí)例化代理進(jìn)行測(cè)試。宿主會(huì)輸出信息,而且客戶端打印返回的消息。代碼如下: //1.WSHttpBinding_IWCFService 【3.4】測(cè)試結(jié)果: 啟動(dòng)宿主、客戶端,進(jìn)行測(cè)試測(cè)試。結(jié)果如圖:
【4】總結(jié): 1)以上測(cè)試可以看出,客戶端的每次請(qǐng)求,服務(wù)端都可以獲取響應(yīng)的地址信息:IP+Port.獲得以后大家可以再進(jìn)行別的處理,比如系統(tǒng)日志LOG、安全限制等等。 2)此特性只是對(duì)http和tcp相關(guān)的綁定器作用,其它綁定WCF沒(méi)有做支持,和實(shí)際綁定的應(yīng)用有關(guān)系。比如NamePipe等。 3)雙向通信,這個(gè)屬性可以獲取服務(wù)端的信息。 4)這個(gè)屬性沒(méi)做欺騙檢測(cè),如果使用作為安全標(biāo)準(zhǔn),要慎重考慮。 以上就是WCF獲取客戶端機(jī)制的介紹和代碼實(shí)現(xiàn)的講解部分,大家基本實(shí)際項(xiàng)目開(kāi)發(fā)可以考慮結(jié)合自身情況使用。 最后給出實(shí)現(xiàn)代碼,可以直接運(yùn)行,版本是VS2008 RTM.NET3.5,大家調(diào)試的時(shí)候注意版本兼容問(wèn)題。下載地址如下: /Files/frank_xl/WCFServiceGetClientAddressFrankXuLei.rar。有問(wèn)題大家可以留言交流,也可以到MSDN中文論壇交流:http://social.microsoft.com/Forums/zh-CN/wcfzhchs/threads。 參考文章: 1.CSDN的討論帖子:http://topic.csdn.net/u/20071226/16/53457f70-e80c-46a6-8dc2-39359ba3433a.html 2.老外的博客:Client IP addresses in Orcas: http://blogs./phenning/archive/2007/08/08/remoteendpointmessageproperty-in-wcf-net-3-5.aspx,VS2008里提供了實(shí)現(xiàn)方法。
分類(lèi): WCF |
|
來(lái)自: 伊本經(jīng)閣 > 《WCF》