URL请求工具
工作中有个需求,定期请求多个URL。“定期”采用计划任务实现,请求URL,虽说start url可以实现,但不灵活。自己制作了个专门请求URL的工具,并记录请求结果。
控制台程序代码:

1 class Program 2 { 3 //日志目录 4 static string logFileDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Log", DateTime.Now.ToString("yyyy-MM")); 5 //日志文件 6 static string logFileName = DateTime.Now.ToString("yyyyMMdd") + ".txt"; 7 //日志文件锁定对象 8 static object logLockObject = new object(); 9 10 static void Main(string[] args) 11 { 12 //创建日志目录 13 try 14 { 15 if (!Directory.Exists(logFileDirectory)) 16 { 17 Directory.CreateDirectory(logFileDirectory); 18 } 19 } 20 catch (Exception ex) 21 { 22 Console.Error.WriteLine(ex.ToString()); 23 } 24 25 //执行请求任务 26 var tasks = ConfigurationManager.AppSettings 27 .AllKeys.Where(key => key.StartsWith(ConfigurationManager.AppSettings["urlSettingsKeyPrefix"])) 28 .Select(key => ConfigurationManager.AppSettings[key]) 29 .Select(url => Task.Factory.StartNew(Request, url)).ToArray(); 30 31 Task.WaitAll(tasks); 32 } 33 34 /// <summary> 35 /// 请求指定的url 36 /// </summary> 37 /// <param name="url"></param> 38 static void Request(object url) 39 { 40 try 41 { 42 var request = WebRequest.Create(url.ToString()) as HttpWebRequest; 43 request.Timeout = Timeout.Infinite; 44 using (var response = request.GetResponse()) 45 using (var responseStream = response.GetResponseStream()) 46 using (var streamReader = new StreamReader(responseStream)) 47 { 48 WriteLog(streamReader.ReadToEnd(), url); 49 } 50 } 51 catch (Exception ex) 52 { 53 WriteLog(ex.ToString(), url); 54 } 55 } 56 57 /// <summary> 58 /// 写日志 59 /// </summary> 60 /// <param name="msg"></param> 61 private static void WriteLog(string msg, object requestUrl) 62 { 63 lock (logLockObject) 64 { 65 try 66 { 67 File.AppendAllText( 68 Path.Combine(logFileDirectory, logFileName), 69 string.Format("[#{0}]{1} {2}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), requestUrl) 70 + Environment.NewLine 71 + msg 72 + Environment.NewLine); 73 } 74 catch (Exception ex) 75 { 76 Console.Error.WriteLine(ex.ToString()); 77 } 78 } 79 } 80 }
App.config:

1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <startup> 4 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 5 </startup> 6 <appSettings> 7 <add key="urlSettingsKeyPrefix" value="urlprefix-"/> 8 9 <add key="urlprefix-url1" value="http://xxxxxx"/> 10 <add key="urlprefix-url2" value="http://xxxxxx"/> 11 <add key="urlprefix-url3" value="http://xxxxxx"/> 12 </appSettings> 13 </configuration>
实际使用时,还需要设置下面这个才能发挥多线程的优势:
ServicePointManager.DefaultConnectionLimit = 20; //可以设置大点
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· C# 13 中的新增功能实操
· 万字长文详解Text-to-SQL
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· 卧槽!C 语言宏定义原来可以玩出这些花样?高手必看!