You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.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的端点逻辑了,这里要做几件事:

  1. 从请求头获取User-Agent
  2. 拼接当前请求的完整Url
  3. 更新或添加Agent到存储容器
  4. 根据Idle时长更新Status(比如超过5分钟标记为离线)
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 19:12:34