日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

WCF服務(wù)如何獲得客戶端IP地址信息(轉(zhuǎn))

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

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ù)論壇的帖子:
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/

   基本都是不能解決,這個(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ù)契約
    [ServiceContract(Namespace = "http://www.cnblogs.com/frank_xl/")]
    
public interface IWCFService
    {
        
//操作契約
        [OperationContract]
        
string SayHelloToUser(string name);

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

        
//實(shí)現(xiàn)接口定義的方法
        public string SayHelloToUser(string name)
        {
            
//提供方法執(zhí)行的上下文環(huán)境
            OperationContext context = OperationContext.Current;
            
//獲取傳進(jìn)的消息屬性
            MessageProperties properties = context.IncomingMessageProperties;
            
//獲取消息發(fā)送的遠(yuǎn)程終結(jié)點(diǎn)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】宿主:使用的是控制臺(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"
        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】客戶端:?jiǎn)?dòng)宿主和添加服務(wù)引用的過(guò)程就詳細(xì)介紹了。我們分別針對(duì)每個(gè)不同的服務(wù)終結(jié)點(diǎn),實(shí)例化代理進(jìn)行測(cè)試。宿主會(huì)輸出信息,而且客戶端打印返回的消息。代碼如下:

 //1.WSHttpBinding_IWCFService
            using (WCFServiceClient wcfServiceProxyHttp = new WCFServiceClient("WSHttpBinding_IWCFService"))
            {
                
string strUserName = "Frank Xu Lei WSHttpBinding ";
                
string strMessage = "";
                
//通過(guò)代理調(diào)用SayHelloToUser服務(wù)
                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 = "";
                
//通過(guò)代理調(diào)用SayHelloToUser服務(wù)
                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 = "";
                
//通過(guò)代理調(diào)用SayHelloToUser服務(wù)
                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 = "";
                
//通過(guò)代理調(diào)用SayHelloToUser服務(wù)
                strMessage = wcfServiceProxyHttp.SayHelloToUser(strUserName);
                Console.WriteLine(strMessage);
            }

【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

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多