小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

WCF服務如何獲得客戶端IP地址信息(轉)

 伊本經(jīng)閣 2012-04-10

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英文技術論壇的帖子:
1.http://social.msdn.microsoft.com/Forums/en-US/wcf/threads

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.服務契約
    [ServiceContract(Namespace = "http://www.cnblogs.com/frank_xl/")]
    
public interface IWCFService
    {
        
//操作契約
        [OperationContract]
        
string SayHelloToUser(string name);

    }
    
//2.服務類,繼承接口。實現(xiàn)服務契約定義的操作
    public class WCFService : IWCFService
    {

        
//實現(xiàn)接口定義的方法
        public string SayHelloToUser(string name)
        {
            
//提供方法執(zhí)行的上下文環(huán)境
            OperationContext context = OperationContext.Current;
            
//獲取傳進的消息屬性
            MessageProperties properties = context.IncomingMessageProperties;
            
//獲取消息發(fā)送的遠程終結點IP和端口
            RemoteEndpointMessageProperty endpoint = properties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
            Console.WriteLine(
string.Format("Hello {0},You are  from {1}:{2}", name, endpoint.Address, endpoint.Port));
            
return string.Format("Hello {0},You are  from {1}:{2}", name, endpoint.Address, endpoint.Port);


        }
    }

【3.2】宿主:使用的是控制臺托管宿主方式,延續(xù)上一個些列的特色。大家很應該很容易就上手了。簡單介紹一下配置過程。    這里配置了HTPP和TCP相關的4個服務終結點進行測試:

<service behaviorConfiguration="WCFService.WCFServiceBehavior"
        name=
"WCFService.WCFService">
        <endpoint 
          address=
"http://localhost:8001/WCFService" 
          binding=
"wsHttpBinding" contract="WCFService.IWCFService">
        </endpoint>
        <endpoint 
          address=
"net.tcp://localhost:8002/WCFService" 
          binding=
"netTcpBinding" contract="WCFService.IWCFService">
        </endpoint>
        <endpoint
          address=
"http://localhost:8003/WCFService"
          binding=
"basicHttpBinding" contract="WCFService.IWCFService">
        </endpoint>
        <endpoint
          address=
"http://localhost:8004/WCFService"
          binding=
"wsDualHttpBinding" contract="WCFService.IWCFService">
        </endpoint>
        <endpoint address=
"mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress=
"http://localhost:8001/"/>
          </baseAddresses>
        </host>
      </service>
    </services>

【3.3】客戶端:啟動宿主和添加服務引用的過程就詳細介紹了。我們分別針對每個不同的服務終結點,實例化代理進行測試。宿主會輸出信息,而且客戶端打印返回的消息。代碼如下:

 //1.WSHttpBinding_IWCFService
            using (WCFServiceClient wcfServiceProxyHttp = new WCFServiceClient("WSHttpBinding_IWCFService"))
            {
                
string strUserName = "Frank Xu Lei WSHttpBinding ";
                
string strMessage = "";
                
//通過代理調用SayHelloToUser服務
                strMessage =wcfServiceProxyHttp.SayHelloToUser(strUserName);
                Console.WriteLine(strMessage);
            }
            
//2.NetTcpBinding_IWCFService
            using (WCFServiceClient wcfServiceProxyHttp = new WCFServiceClient("WSHttpBinding_IWCFService"))
            {
                
string strUserName = "Frank Xu Lei NetTcpBinding ";
                
string strMessage = "";
                
//通過代理調用SayHelloToUser服務
                strMessage = wcfServiceProxyHttp.SayHelloToUser(strUserName);
                Console.WriteLine(strMessage);
            }
            
//3.BasicHttpBinding_IWCFService
            using (WCFServiceClient wcfServiceProxyHttp = new WCFServiceClient("WSHttpBinding_IWCFService"))
            {
                
string strUserName = "Frank Xu Lei BasicHttpBinding ";
                
string strMessage = "";
                
//通過代理調用SayHelloToUser服務
                strMessage = wcfServiceProxyHttp.SayHelloToUser(strUserName);
                Console.WriteLine(strMessage);
            }
            
//4.WSDualHttpBinding_IWCFService,
            using (WCFServiceClient wcfServiceProxyHttp = new WCFServiceClient("WSHttpBinding_IWCFService"))
            {
                
string strUserName = "Frank Xu Lei WSDualHttpBinding ";
                
string strMessage = "";
                
//通過代理調用SayHelloToUser服務
                strMessage = wcfServiceProxyHttp.SayHelloToUser(strUserName);
                Console.WriteLine(strMessage);
            }

【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

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多