URL的WebClient问题,以句点结尾

我正在运行以下代码;

using (WebClient wc = new WebClient()) { string page = wc.DownloadString(URL); ... } 

要访问股价网站的URL, 请访问http://www.shareprice.co.uk

如果您将公司的符号名称附加到URL的末尾,则会返回一个页面,我将其解析以获取最新的价格信息等。

例如

http://www.shareprice.co.uk/VOD

http://www.shareprice.co.uk/TW 。

现在,我的问题是某些符号以句点结束,如第二个示例所示。 由于某些未知原因,上面的代码在检索这些类型的URL时出现问题。

没有运行时错误,但返回一个页面,报告“无法找到符号”来自网站本身,表明在调用DownloadString和之间的URL末尾发生了某些事情。实际的HTTP请求。

有谁知道可能导致这种情况的原因,以及如何解决这个问题?

谢谢

看来你在WebClient / WebRequest中发现了一个错误,尽管微软可能会故意这样做,谁知道呢。 尽管如此,当您传入TW。时,URI类正在将其转换为TW而没有句点。 由于WebClient / WebRequest将字符串解析为URI,因此您的。 正在那个世界消失。

您可能必须使用TcpClient来解决此问题并滚动您自己的Web客户端。 任何变化:

 TcpClient oClient = new TcpClient("www.shareprice.co.uk", 80); NetworkStream ns = oClient.GetStream(); StreamWriter sw = new StreamWriter(ns); sw.Write( string.Format( "GET /{0} HTTP/1.1\r\nUser-Agent: {1}\r\nHost: www.shareprice.co.uk\r\n\r\n", "TW.", "MyTCPClient" ) ); sw.Flush(); StringBuilder sb = new StringBuilder(); while (true) { int i = ns.ReadByte(); // Inefficient but more reliable if (i == -1) break; // Other side has closed socket sb.Append( (char) i ); // Accrue 'c' to save page data } oClient.Close(); 

这将为您提供302重定向,因此只需解析“位置:”并使用新位置再次执行上述操作。

 HTTP/1.1 302 Found Date: Wed, 11 Nov 2009 19:29:27 GMT Server: lighttpd X-Powered-By: PHP/5.2.4-2ubuntu5.7 Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Location: /TW./TAYLOR-WIMPEY-PLC Content-type: text/html; charset=UTF-8 Content-Length: 0 Set-Cookie: SSID=668d5d0023e9885e1ef3762ef5e44033; path=/ Vary: Accept-Encoding Connection: close 

在句点之后尝试在末尾添加斜杠。 您的普通Web浏览器将为您执行此操作,而WebClient类并不那么聪明。

 http://www.shareprice.co.uk/TW./ 

当我在浏览器中输入它时,这也适用于我。

编辑 – 添加

以下所有内容也适用于浏览器

 http://www.shareprice.co.uk/TW 

http://www.shareprice.co.uk/TW/

所以看起来你应该能够检查最后一个字符是否是一个句点,并将其删除。

使用URL编码…它将转为“。” 进入%2E

要在URL末尾处理单个句点(。),请使用以下命令:

    

要解决两个句点(..)或其他拒绝序列,请参阅以下文章:

http://www.iis.net/ConfigReference/system.webServer/security/requestFiltering/denyUrlSequences

只需在句点之后添加一个空格,当解析空间时将被删除,但句点将保留在那里。