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 积分,解读结果公开显示在下面。
还没有人解读过这个文件。
