WebRequest對DNS說 沒有你我依然可以

2021-06-15 04:08:07 字數 2176 閱讀 6087

前言

標題中的「沒有你我依然可以」引用自王傑一首歌的名字《沒有你我依然可以》。

webrequest - 就是大家熟知的system.net.webrequest,.net世界中**們用的「瀏覽器」。

dns - domain name system,就是大家熟知的將網域名稱解析為ip位址的系統。 起因

今天園友sixserve在博問上問了乙個問題 - c# socket http請求時怎麼跟上網域名稱資訊:

rt,乙個ip上的iis可能繫結了多個站點,直接請求的話iis不知道你要請求哪個站點,所以有什麼辦法可以把網域名稱資訊跟上好讓iis知道,不要用webclient和其他的,這個網域名稱繫結的是內網位址,如果用webclient、webrequest這樣的話要改host檔案了。

問題解讀:

1. 如何通過客戶端(不是瀏覽器,是一段c#**)訪問目標web伺服器上繫結的指定網域名稱的站點(比如假設這裡是q.cnblogs.com),而這個網域名稱在dns與客戶端的hosts檔案中沒有對應的ip位址解析,所以只能通過ip位址進行訪問(比如這裡假設是61.155.169.118)。但是,由於這個web伺服器繫結了多個站點,需要通過不同的主機名(網域名稱)進行區分,僅有ip位址,web伺服器無法知道你要訪問的目標主機名。也就是你通過 無法訪問到 由於沒有主機名資訊);通過  訪問,請求根本無法到達目標web伺服器(由於沒有dns解析,客戶端不知道目標ip位址)。

2. 問題也就變成了:通過ip位址訪問目標web伺服器時,如何將主機名的資訊傳遞給web伺服器?園友sixserve想通過socket來實現,並強調了不要用webclient,webrequest這類的(可能是基於這樣的假設:用它們只能在網域名稱與ip位址之間選乙個。之前我也是這麼認為的)。

問題解決過程

早上看到這個提問時,我立即來了興趣。因為昨天剛剛學習了阮一峰的網際網路協議入門,正在勁頭上。

這裡對webrequest的執著,並不是偏執,是經過考慮的。只要解決了dns解析問題,就能用webrequest通過主機名訪問。那如何解決dns解析的問題呢?不能給dns新增記錄,不能修改hosts檔案,那怎麼辦?

1. 首先,我想到的解決思路是:能不能找到一種方法向通過c#**向本地dns快取中新增一條解析記錄。因為在dns解析過程中,會先在本地dns快取中查詢。。。但此路不通,未找到實現方法。

2. 後來,在stackoverflow上找到一種解決思路:hook wsock32.dll中對應的api,也就是在客戶端進行dns解析的過程中,會呼叫wsock32.dll中的api,只要截獲這個呼叫請求,對於要解析的主機名返回對應的ip即可。回答者給出了c++實現**:

struct hostent far * wsaapi mygethostbyname(in const char far * name)

// return the result

return ret;

}

並提供了c#的實現思路,通過 easyhook 進行hook。

這個方法雖然可行,但太複雜,並沒有成為心目中的「她」 —— 還是簡單點好。

這個複雜的解決方法反而影響了我繼續解決問題的興趣,幾乎準備放棄對這個問題的繼續研究。

問題解決方法

很多時候,柳暗花明就在你最因難、最無助、最精疲力盡、最想放棄的前方100公尺。。。

當時就眼前一亮,心中隱約感覺到就是「她」。。。接下來只需驗證一下剛剛發現的這個「她」是不是就是一直在尋找的「她」。。。

功夫不負有心人,事實證明就是「她」,終於找到了!下面的**就是見證:

[fact]

///q/38881/

public void q38881_test()}}

**執行結果:

寫了這麼多,就是為了這一行**:request.host = "q.cnblogs.com"; 等了那麼多年,就是為了那乙個人。**如此,生活也是如此。。。結果往往很簡單,而真正激動人心的是其中的過程。

這行**的意義在於可以讓webrequest不依賴dns,於是才有了這樣的故事 —— webrequest對dns說:沒有你我依然可以。

對DNS的認識

dns domain name system 網域名稱系統 1.網域名稱是什麼 網域名稱是網際網路上的身份標識,類似於我們實際生活中的身份證。2.為什麼需要網域名稱 更方便快捷的訪問到網際網路。3.dns是做什麼的 幫我們解析網域名稱的,dns是網域名稱 主機名 和ip位址相互對映的分布式資料庫。4...

對DNS的認識

dns domain name system 是網域名稱解析系統的縮寫 一.dns 網域名稱解析系統 的組成 網域名稱解析系統 解析器 網域名稱伺服器 網域名稱空間 網域名稱伺服器 是指儲存有該網路中所有主機的網域名稱和對應ip位址,並具有將網域名稱轉換為 ip位址功能的 伺服器 解析器是inter...

對偽粗體說No

此博文摘自本文表達其意思,並非完全翻譯。如果使用了bold或者italic的字型外形修飾了文字,而字型本身不提供bold和italic系列的字型外形,瀏覽器就會嘗試自己補償這些效果。原文作者並不同意甚至對瀏覽器的這種做法有強烈反感。用原文作者的話講,瀏覽器偽造的加粗就是在正常版本上塗上汙跡斑斑的一層...