src/mvc/admin/Bootstrap.Admin/Pages/Extensions/HttpContextExtensions.cs

(完整代码) 2KB

// Copyright (c) Argo Zhang (argo@163.com). All rights reserved.
// Licensed under the LGPL License, Version 3.0. See License.txt in the project root for license information.
// Website: https://admin.blazor.zone

using Bootstrap.DataAccess;
using Longbow.Cache;
using Longbow.Web;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Net;

namespace Microsoft.AspNetCore.Http
{
    /// <summary>
    /// HttpContextExtensions 扩展方法
    /// </summary>
    public static class HttpContextExtensions
    {
        /// <summary>
        /// 保存访问日志方法
        /// </summary>
        public static void SaveOnlineUser(this HttpContext context, string url)
        {
            var onlineUserSvr = context.RequestServices.GetRequiredService<IOnlineUsers>();
            var locator = context.RequestServices.GetRequiredService<IIPLocatorProvider>();
            var proxy = new Func<AutoExpireCacheEntry<OnlineUser>, Action?, AutoExpireCacheEntry<OnlineUser>>((c, action) =>
            {
                var v = c.Value;
                v.LastAccessTime = DateTime.Now;
                v.Method = context.Request.Method;
                v.RequestUrl = url;
                v.AddRequestUrl(url);
                action?.Invoke();
                TraceHelper.Save(context, v);
                return c;
            });
            onlineUserSvr.AddOrUpdate(context.Connection.Id ?? "", key =>
            {
                var agent = context.Request.Headers["User-Agent"];
                var userAgent = string.IsNullOrEmpty(agent) ? null : new UserAgent(agent);
                var v = new OnlineUser
                {
                    UserAgent = agent,
                    ConnectionId = key,
                    Ip = context.Connection.RemoteIpAddress?.ToIPv4String() ?? string.Empty,
                    Browser = userAgent == null ? "Unknown" : $"{userAgent.Browser?.Name} {userAgent.Browser?.Version}",
                    OS = userAgent == null ? "Unknown" : $"{userAgent.OS?.Name} {userAgent.OS?.Version}",
                    FirstAccessTime = DateTime.Now,
                    Referer = context.Request.Headers["Referer"]
                };
                var t = locator.Locate(v.Ip);
                if (t.IsCompletedSuccessfully)
                {
                    v.Location = t.Result;
                }
                return proxy(new AutoExpireCacheEntry<OnlineUser>(v, 1000 * 60, __ => onlineUserSvr.TryRemove(key, out _)), null);
            }, (key, v) => proxy(v, () => v.Reset()));
        }
    }
}

24 小时内免费解锁 3 个项目,之后 1 积分/个。 规则说明

AI 解读

登录后可用,每次 10 积分,解读结果公开显示在下面。

还没有人解读过这个文件。