首页 > 解决方案 > c# httpclient 遇到问题 - 初学者

问题描述

我遇到了一个我不太了解的问题。我正在尝试运行一个脚本,该脚本会在网站上找到特定术语时通知我。

对于大多数网站 webClient 类都在工作,但是在https://amd.com等其他网站上,我必须使用 httpClient 类。

如果我使用这样的 httpClient 请求进行循环:

while(true)
{
   if (erfolg4 == 0)
            {
                
                try
                {
                    HttpClient httpClient = new HttpClient();
                    httpClient.DefaultRequestHeaders.UserAgent.TryParseAdd("Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1");
                    httpClient.Timeout = TimeSpan.FromSeconds(3);
                    string htmlCode = await httpClient.GetStringAsync("https://www.amd.com/de/direct-buy/5450881500/de");                        
                    httpClient.Dispose();

                    if (htmlCode.Contains("Out of stock"))
                    {
                        Console.WriteLine("cpu not available");
                    }
                    else
                    {
                        Console.WriteLine("found");
                        SoundPlayer simpleSound = new SoundPlayer(@"c:\Windows\Media\test.wav");
                        simpleSound.Play();
                        erfolg4 = 1;
                        EmailSend("AMD CPU");
                        await Task.Delay(20000);
                    }

                }
                catch (Exception e)
                {
                    Console.WriteLine("error amd cpu");
                    Console.WriteLine(e);
                }
                                    
            }
}

它每秒钟都会遇到超时异常。如果我运行这个程序的多个实例,它仍然会在循环运行时每秒失败一次(但是两个循环都是独立的)。

如果我想在https://amd.com的子域上搜索另一个术语,它总是会失败。好像还有一个打开的套接字会阻止任何其他连接。

有人有想法吗?

标签: c#socketshttpclient

解决方案


基于 HttpClient 文档:

“HttpClient 旨在被实例化一次并在应用程序的整个生命周期中重复使用。为每个请求实例化 HttpClient 类将耗尽重负载下可用的套接字数量。这将导致 SocketException 错误。”

来源:https ://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=net-5.0

如果你在循环之前创建了客户端的实例,你还会得到异常吗?

HttpClient httpClient = new HttpClient();
while(true)
{
   if (erfolg4 == 0)
            {
                
                try
                {
                    httpClient.DefaultRequestHeaders.UserAgent.TryParseAdd("Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1");
                    httpClient.Timeout = TimeSpan.FromSeconds(3);
                    string htmlCode = await httpClient.GetStringAsync("https://www.amd.com/de/direct-buy/5450881500/de");

                    if (htmlCode.Contains("Out of stock"))
                    {
                        Console.WriteLine("cpu not available");
                    }
                    else
                    {
                        Console.WriteLine("found");
                        SoundPlayer simpleSound = new SoundPlayer(@"c:\Windows\Media\test.wav");
                        simpleSound.Play();
                        erfolg4 = 1;
                        EmailSend("AMD CPU");
                        await Task.Delay(20000);
                    }

                }
                catch (Exception e)
                {
                    Console.WriteLine("error amd cpu");
                    Console.WriteLine(e);
                }
                                    
            }
}
httpClient.Dispose();

推荐阅读