我正在运行以下代码;
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请求。
有没有人知道可能导致这种情况的原因,以及如何解决这个问题?
由于
答案 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)
只需在句点之后添加一个空格,当解析空格时将被删除,但句点将保留在那里。