2011年3月7日 星期一

模擬Javascript取得client IP

有朋友問在LoadBalance後的ASP.NET程式取得的Client IP都是LB的虛擬IP,這是因為後面的LB之後,Client的Request會先傳送到LB的Server,再透過LB往後傳送到真實的Server,所以透過ASP.NET的Request.UserHostAddress會抓取到的是虛擬IP。針對這個問題我想到的有兩種解決方案,第一透過RIA程式,例如Silverlight或Flex之類的程式抓取ClientIP後,再透過操作dom物件塞到html dom,這樣submit的時候就能取得;第二種做法是找一台不在LB後面的機器,也就是用IP可以直接access到的server,在這一台server提供一個模擬Javascript寫出hidden的欄位,其值再給予Client IP即可(因該Server不在LB後面所以Request.UserHostAddress可以正確抓取Client IP),以下示範第二種做法使用ASP.NET實做。



撰寫一泛型處理常式 ClientIP.ashx如下
注意第9行ContentType設定為 text/javascript,這是為了模擬Javascript,而第11行模擬Javascript的document.write的時候要注意拖曳字元的部分使用了\\兩個,第一個是給C#程式使用的,而第二個是給Javascript使用的,目的是要給C#可以印出document.write(' <input type=\'hidden\' ...

撰寫完上面的程式碼後,我們接下來看怎麼套用,新增一個aspx的網頁,內容如下
注意12行的地方新增一按鈕,這是為了製造submit(PostBack)所用,13行部分使用javascript的src語法將ClientIP.ashx引入,注意這裡因為我是測試程式,都放在同一台電腦,正確來說你應該會放在一台具有獨立IP的Server,例如 http://210.100.50.20/ClientIP.ashx ,最後請於該按鈕的click event中撰寫程式碼如下(注意16行需使用Request.Form["UserIP"]才能抓取到透過Javascript 寫出的hidden欄位)

 瀏覽網頁點選按鈕執行結果如下




沒有留言: