2011-12-19 448 views
2

我已經寫了通過下面的代碼在C#中使用System.Net.HttpListener一個簡單的服務器:最大URL長度

Listener = new HttpListener(); 
Listener.Prefixes.Add(Prefix); 
Listener.Start(); 
Listener.BeginGetContext(GetContextCallback, null); 

我注意到,我的服務器返回一個400 (錯誤請求)每當我發送的URL(在HTTP GET中)超過約255個字符時,HTTP響應。我已經做了一些研究,似乎沒有標準,儘管大多數瀏覽器和服務器似乎至少可以處理大約2000個字符。

有趣的是我的GetContextCallback()甚至在它以這種方式失敗時都不會被調用。

我真的想弄清楚如何配置它來支持大於255個字符,有誰知道是否有可能?

謝謝!

更新:我發現此限制似乎不在整個URL上,而是在單個目錄名稱上。我猜這與MAX_PATH有關,但是我知道其他服務器可以處理這個事實,而且我已經看到了實際的鏈接「瘋狂」,其目錄名稱爲300多個字符(特別是Google的鏈接像/ extern_js/f/........)。

更新:我測試我的服務器通過telnet,使用以下GET請求:

GET /013456789013456789013456789013456789013456789013456789013456789013456789013456789013456789013456789013456789013456789013456789013456789013456789013456789013456789013456789013456789013456789013456789013456789013456789013456789013456789013456789013456789013456789013456789/test.html 
Host: 10.15.38.80:8008 
Accept: */* 
+0

我剛剛從瀏覽器中測試了超過800個字符的字符串,它工作得很好。你能發佈你用於HTTP GET的代碼嗎? – 2011-12-19 19:03:58

+0

我實際上沒有使用代碼來測試,我正在使用telnet。我更新了原始帖子,以包含打破HttpListener的路徑(使用400個返回碼)。 – Locksleyu 2011-12-19 19:15:40

+0

你是對的,這絕對是一個文件夾限制。似乎有些網站支持它(我可以將該URL發佈到google.com沒有問題),但其他網站則不支持(Microsoft.com返回無效的URL錯誤)。問題在於,你是否真的需要文件夾名稱中的那麼多信息?如果您只添加1個子文件夾並將其分成兩半,它仍然有效。我建議保持文件夾級別較小並將數據放入查詢字符串中。 – 2011-12-19 19:41:12

回答

3

似乎有不被任何其他方式,但在註冊表中設置的值。

轉到HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services \ HTTP \ Parameters並創建一個名爲UrlSegmentMaxLength的DWORD(32位)參數。將該值設置爲0,您不會再爲長網址問題而煩惱。

在更改應用之前,您必須重新啓動。

來源:http://support.microsoft.com/kb/820129