HTTPWebRequest,如何防止更改大小写的主机/标头值

问题描述:

我正在使用HttpWebrequest(.Net 4.0)通过此代码与我的服务器通信。我的问题是,客户端对象将请求的'主机'部分转换为小写(在我的情况下是“TETRA_20”),然后再写入线路。因此,我的服务器拒绝这个HTTP请求。HTTPWebRequest,如何防止更改大小写的主机/标头值

有人遇到类似的问题并修复它吗?这是.Net框架的问题吗?

HttpWebRequest client = (HttpWebRequest)WebRequest.Create(uri); 
WebHeaderCollection myWebHeaderCollection = client.Headers; 
client.SendChunked = false; 

if (hostAlias != null) 
    client.Host = "TETRA_20"; 
client.UserAgent ="Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko/20100101 Firefox/11.0";     
client.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
client.KeepAlive = true; 

myWebHeaderCollection.Set("Cache-Control", "max-age=0"); 
myWebHeaderCollection.Set("Accept-Encoding", "gzip,deflate"); 
myWebHeaderCollection.Set("Accept-Language", "en-US,en;q=0.5"); 

WebResponse responseData = client.GetResponse(); 
+1

也许值得考虑的RFC的DNS大小写敏感的读:http://tools.ietf.org/html/rfc4343(这毕竟是一个主机名是所有关于)。 – spender 2013-02-26 18:20:53

+1

国际海事组织,它是“你的服务器”,这是保持区分大小写的概念在这里行为不端。 – spender 2013-02-26 18:22:17

+0

@spender:这是一个从服务器家伙 – 2ndlife 2013-02-26 18:29:42

通过谷歌找到了这个。 RFC2616(第3.2.3节)规定主机头部评估必须不区分大小写。所以这是一个很好的做法,设置主机头值之前小写...

3.2.3 URI比较

当比较两个URI是否匹配与否来决定,客户端应该使用区分大小写的八位位组按八位字节比较整个URI的,但以下情况除外:

  • 为空或不给予一个端口等同于默认 端口为URI引用;
    • 主机名称比较必须不区分大小写;
    • 方案名称比较必须不区分大小写;
    • 一个空的abs_path相当于一个“/”的abs_path。
+0

谢谢A-Dubb,但服务器被有意实施为区分大小写。客户可以做些什么来避免这种转换? – 2ndlife 2013-02-26 18:30:31

+1

有没有办法让服务器不区分大小写?如果可能的话,我认为你的服务器应该符合规范。如果你想绕过由更高级别API实施的约束,那么你很可能不得不使用较低级别的实现;例如插座。 – 2013-02-26 18:31:41

+2

用标准来越野是一个不错的主意。即使你能使它工作,在客户端和服务器之间(也许是一个代理服务器)抛出一些随机的硬件,你也许会发现你也需要“修复”这些。任何人推荐不符合标准的方法都是错误的。 – spender 2013-02-26 18:37:38