c# - 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的子域上搜索另一个术语,它总是会失败。好像还有一个打开的套接字会阻止任何其他连接。
有人有想法吗?
解决方案
基于 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();
推荐阅读
- sql - SAS SQL根据宏变量结果创建表
- c# - PMC 错误:术语“get-mgrations”未被识别为 cmdlet 的名称
- r - 我希望 r 在向量中安排/合并我的重采样
- android - 启动时未触发 BroadcastReceiver - 以编程方式
- c++ - 如何使用 boost.thread 运行多个接收器,每个线程应该为每个接收器分配?
- elasticsearch - 使用 RPM 存储库确定 Elasticsearch 次要版本
- angular - 获取单条记录数据AngularFireDatabase
- git - bitbucket 管道无限期地运行
- c# - 用于查找不在“”字符之间的单词的正则表达式
- awk - 如何通过 grep 命令在 gnuplot 中使用 for 循环