【问题标题】:WebClient problem with URL which ends with a period以句点结尾的 URL 的 WebClient 问题
【发布时间】:2009-11-11 17:12:43
【问题描述】:

我正在运行以下代码;

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 和实际的 HTTP 请求。

有谁知道这可能是什么原因造成的,以及如何解决?

谢谢

【问题讨论】:

  • 你控制shareprice.co.uk,还是这是一个第三方网站?
  • 如果是第 3 方,您是否查看过他们关于如何处理 URL 中的句点的文档?
  • 这是一个第 3 方网站,我与他们完全没有任何关系——这只是我正在做的一个小爱好项目。我可能应该澄清一下,如果您在浏览器中键入一个末尾带有句点的地址,它就可以正常工作。因此,这里的问题,我认为它一定是一个 .NET 问题。
  • 您是否尝试过不带 . 的相同网址?当您通过浏览器访问时,他们可能会在客户端执行某些操作。您可以尝试对 url 字符串进行 url 编码。当我问谷歌时,我看到其他一些人在各种平台上遇到了类似的问题。

标签: c# url webclient


【解决方案1】:

您似乎在 WebClient/WebRequest 中发现了一个错误,尽管可能是 Microsoft 故意放入的,谁知道呢。尽管如此,当您传入 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 重定向,因此只需解析 'Location:' 并使用新位置再次执行上述操作。

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

【讨论】:

  • 没问题,很高兴能帮上忙。
【解决方案2】:

尝试在句号之后添加一个斜线。您的普通网络浏览器会为您执行此操作,而 WebClient 类并不那么聪明。

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

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

编辑 - 添加

以下都在浏览器中工作

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

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

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

【讨论】:

  • 但是它似乎在 WebClient 或 WebRequest 中不起作用。这两个类都将字符串转换为 Uri。当一个 Uri 被交给那个 TW。 url,它似乎删除了句号。大概它认为您打算完成文件扩展名,但它没有完成,所以它只是将其切断。
【解决方案3】:

使用 URL 编码...它将变成“。”进入 %2E

【讨论】:

  • 乍一看,有人会认为这是可行的,但似乎不行。
  • 您是否使用 Fiddler 来跟踪调用?可能是个好主意。当您可以看到原始请求的外观时,它有时会提供比简单的旧调试更多的线索。
【解决方案4】:

要解决 URL 末尾的单个句点 (.),请使用以下命令:

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

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

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

【讨论】:

    【解决方案5】:

    句号后面加一个空格,解析时空格会被去掉,句号会一直留在那里。

    【讨论】:

      猜你喜欢
      • 2010-11-10
      • 2022-01-17
      • 2016-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 2021-01-21
      相关资源
      最近更新 更多