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