URL的WebClient问题,以句点结束

时间:2009-11-11 17:12:44

标签: c# url webclient

我正在运行以下代码;

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

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

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

e.g。

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

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

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

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

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

由于

5 个答案:

答案 0 :(得分:2)

似乎你在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

答案 1 :(得分:1)

尝试在句号结束后添加斜杠。您的普通Web浏览器将为您完成此操作,而WebClient类并不那么聪明。

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

当我在浏览器中输入时,这对我也很有用。

修改 - 添加

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

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

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

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

答案 2 :(得分:0)

使用网址编码...它将转为“。”进入%2E

答案 3 :(得分:0)

要在网址末尾处理单个句点(。),请使用以下内容:

<system.web>
             <httpRuntime relaxedUrlToFileSystemMapping="true" /> 
</system.web>

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

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

答案 4 :(得分:0)

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