如何在.NET Core极简API中获取包含Idle、Status和Url的User-Agent列表
实现.NET Core极简API的Agent列表返回功能
嘿,刚好做过类似的需求,我来一步步教你怎么实现!
首先,我们需要先定义一个数据模型来承载你要返回的Agent信息,把User-Agent、Idle、Status和Url都封装进去:
public class AgentInfo { // 请求头里的User-Agent值 public string UserAgent { get; set; } // 记录最后活跃时间,用来计算Idle时长 public DateTime LastActive { get; set; } // 自动计算Idle时长(当前时间减最后活跃时间) public TimeSpan Idle => DateTime.UtcNow - LastActive; // 在线/离线状态 public string Status { get; set; } // 当前请求的Url public string Url { get; set; } }
接下来,我们需要一个线程安全的存储容器来维护Agent列表——因为极简API是多请求并发的,普通List会有线程安全问题,推荐用ConcurrentDictionary(用User-Agent作为键,避免重复记录同一个客户端):
// 可以放在Program.cs里作为全局静态变量,或者注册为DI单例(更优雅) private static readonly ConcurrentDictionary<string, AgentInfo> _agentStore = new();
然后就是写极简API的端点逻辑了,这里要做几件事:
- 从请求头获取
User-Agent - 拼接当前请求的完整Url
- 更新或添加Agent到存储容器
- 根据Idle时长更新Status(比如超过5分钟标记为离线)
- 返回所有Agent列表
完整的端点代码如下:
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); // 全局静态存储Agent信息 private static readonly ConcurrentDictionary<string, AgentInfo> _agentStore = new(); app.MapGet("/api/agents", (HttpContext context) => { // 获取请求头的User-Agent var userAgent = context.Request.Headers["User-Agent"].ToString(); if (string.IsNullOrEmpty(userAgent)) { return Results.BadRequest("User-Agent header is missing"); } // 拼接当前请求的完整Url var requestUrl = $"{context.Request.Scheme}://{context.Request.Host}{context.Request.Path}{context.Request.QueryString}"; // 更新或添加Agent记录(线程安全) _agentStore.AddOrUpdate( userAgent, key => new AgentInfo { UserAgent = key, LastActive = DateTime.UtcNow, Status = "Online", Url = requestUrl }, (key, existingAgent) => { existingAgent.LastActive = DateTime.UtcNow; existingAgent.Url = requestUrl; return existingAgent; }); // 更新所有Agent的状态:Idle超过5分钟标记为Offline foreach (var agent in _agentStore.Values) { agent.Status = agent.Idle.TotalMinutes > 5 ? "Offline" : "Online"; } // 返回Agent列表 return Results.Ok(_agentStore.Values); }); app.Run();
几个关键细节说明:
- 线程安全:用
ConcurrentDictionary避免多请求同时操作时的冲突问题,适合极简API的轻量级场景。 - Idle计算:通过
LastActive字段和当前时间的差值自动计算,不需要手动维护。 - Status逻辑:你可以根据需求调整离线阈值(比如改成10分钟),甚至扩展成更复杂的状态(比如Away)。
- Url获取:用
HttpContext的Scheme(http/https)、Host(域名+端口)、Path和QueryString拼接完整请求Url,确保准确性。
如果需要持久化Agent信息(比如重启API后不丢失),可以把ConcurrentDictionary换成数据库操作(比如EF Core),但对于极简需求来说,静态存储已经足够好用啦!
内容的提问来源于stack exchange,提问作者Alexandre Carvalho
相关产品推荐
相关产品推荐

