代码之家  ›  专栏  ›  技术社区  ›  classical312

当链接末端存在点时,找不到WebClient响应404

  •  1
  • classical312  · 技术社区  · 10 年前

    页面以点结尾时出现异常错误,例如:

    http://www.carsireland.ie/car-dealers/county/donegal/prestige-cars-ireland-ltd .

    当我在Chrome浏览器中打开它时,一切都正常工作,但当我尝试以下操作时:

    WebClient client = new WebClient();
                html = client.DownloadString("http://www.carsireland.ie/car-dealers/county/donegal/prestige-cars-ireland-ltd.");
    

    我得到:

    “System.Net类型的未处理异常。”。WebException“发生在 系统.dll

    其他信息:远程服务器返回错误:(404)不 建立

    有趣的是,这只发生在.NETFramework4上。

    我有很多类似的链接,我如何才能修复它?

    1 回复  |  直到 10 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

    更新: 我发现这实际上是一个已知的bug。NET4.5中,Uri类对待url的方式与桌面上的路径相同。在桌面上,尾随的句点并不重要,因此它被删除。 下面是另一个堆栈溢出问题的答案: link to answer with code example

    尝试首先将字符串包装在Uri对象中,就像我在下面所做的那样。下面的代码对我来说很好。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Net;
    
    namespace DownloadString
    {
        class Program
        {
            static void Main(string[] args)
            {
                WebClient client = new WebClient();
                Uri uri = new Uri("http://www.carsireland.ie/car-dealers/county/donegal/prestige-cars-ireland-ltd.");
                string str = client.DownloadString(uri);
                Console.WriteLine(str);
                Console.ReadKey();
            }
        }
    }
    

    让我知道它的工作原理!

    Here is a fiddle 用相同的代码来证明它是有效的

    正如你在评论中提到的,这在.NET4.0中不起作用。我也在3.5中测试过它,但它不起作用了。

    经过进一步调查,我发现任何低于.NET4.5的内容都会在发出请求之前从url末尾去掉句点。这是一张图片,显示了Fiddler中的两个http请求。它们都是用相同的代码编写的,但第一个是用.NET4.0编译的,&第二个是使用.NET 4.5。

    Comparison between .NET 4.0 & .NET 4.5 requests