2011-12-19 286 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