为什么我的 WebClient 大多数时候会返回 404 错误,但并非总是如此?

2024-03-28

我想要获取有关我的程序中的 Microsoft 更新的信息。但是,服务器在大约 80% 的情况下会返回 404 错误。我将有问题的代码归结为这个控制台应用程序:

using System;
using System.Net;

namespace WebBug
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                try
                {
                    WebClient client = new WebClient();
                    Console.WriteLine(client.DownloadString("https://support.microsoft.com/api/content/kb/3068708"));
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                Console.ReadKey();
            }
        }
    }
}

当我运行代码时,我必须执行几次循环,直到得到实际响应:

远程服务器返回错误:(404) 未找到。
远程服务器返回错误:(404) 未找到。
远程服务器返回错误:(404) 未找到。

我可以根据需要经常打开并强制刷新(Ctrl + F5)浏览器中的链接,但它会显示得很好。

该问题发生在具有两个不同互联网连接的两台不同计算机上。
我还使用 Html Agility Pack 测试了此案例,但结果相同。
问题是not与其他网站一起发生。 (根https://support.microsoft.com100% 的时间都工作正常)

为什么我会得到这个奇怪的结果?


饼干。这是因为饼干。

当我开始深入研究这个问题时,我注意到第一次在新浏览器中打开该网站时出现了 404,但刷新后(有时一次,有时几次)该网站继续工作。

就在那时,我淘汰了 Chrome 的隐身模式和开发者工具。

网络上并没有什么太可疑的地方:如果你加载了 http,就会有一个简单的重定向到 https 版本。

但我确实注意到cookies发生了变化。这是我第一次加载页面时看到的内容:

这是一次(或几次)刷新后的页面:

注意到如何添加更多 cookie 条目了吗?该网站一定是试图阅读这些内容,但没有找到它们,然后“阻止”您。我不确定这可能是机器人预防设备或错误的编程。

不管怎样,这里是如何让你的代码工作的。此示例使用 HttpWebRequest/Response,而不是 WebClient。

string url = "https://support.microsoft.com/api/content/kb/3068708";

//this holds all the cookies we need to add
//notice the values match the ones in the screenshot above
CookieContainer cookieJar = new CookieContainer();
cookieJar.Add(new Cookie("SMCsiteDir", "ltr", "/", ".support.microsoft.com"));
cookieJar.Add(new Cookie("SMCsiteLang", "en-US", "/", ".support.microsoft.com"));
cookieJar.Add(new Cookie("smc_f", "upr", "/", ".support.microsoft.com"));
cookieJar.Add(new Cookie("smcexpsessionticket", "100", "/", ".microsoft.com"));
cookieJar.Add(new Cookie("smcexpticket", "100", "/", ".microsoft.com"));
cookieJar.Add(new Cookie("smcflighting", "wwp", "/", ".microsoft.com"));

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
//attach the cookie container
request.CookieContainer = cookieJar;

//and now go to the internet, fetching back the contents
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using(StreamReader sr = new StreamReader(response.GetResponseStream()))
{
    string site = sr.ReadToEnd();
}

如果您删除request.CookieContainer = cookieJar;,它将失败并显示 404,这会重现您的问题。

代码示例的大部分跑腿工作来自这个帖子 https://stackoverflow.com/a/15207262/1043380 and 这个帖子 https://stackoverflow.com/a/14551410/1043380.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的 WebClient 大多数时候会返回 404 错误,但并非总是如此? 的相关文章

随机推荐