77 lines
2.3 KiB
C#
77 lines
2.3 KiB
C#
using System;
|
|
using System.Threading.Tasks;
|
|
using Microsoft.AspNetCore.Http;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using NewLife;
|
|
using NewLife.Log;
|
|
using NewLife.Web;
|
|
using Stardust.Registry;
|
|
using HttpContext = Microsoft.AspNetCore.Http.HttpContext;
|
|
|
|
namespace Stardust.Extensions
|
|
{
|
|
/// <summary>注册服务中间件</summary>
|
|
public class RegistryMiddleware
|
|
{
|
|
private readonly RequestDelegate _next;
|
|
private readonly IServiceProvider _serviceProvider;
|
|
|
|
/// <summary>用户访问地址。记录用户通过哪个地址访问本系统</summary>
|
|
public static Uri UserUri { get; set; }
|
|
|
|
/// <summary>实例化</summary>
|
|
/// <param name="next"></param>
|
|
/// <param name="serviceProvider"></param>
|
|
public RegistryMiddleware(RequestDelegate next, IServiceProvider serviceProvider)
|
|
{
|
|
_next = next ?? throw new ArgumentNullException(nameof(next));
|
|
_serviceProvider = serviceProvider;
|
|
}
|
|
|
|
/// <summary>调用</summary>
|
|
/// <param name="ctx"></param>
|
|
/// <returns></returns>
|
|
public async Task Invoke(HttpContext ctx)
|
|
{
|
|
CheckUserUri(ctx);
|
|
|
|
await _next.Invoke(ctx);
|
|
}
|
|
|
|
private Boolean _inited;
|
|
private void CheckUserUri(HttpContext ctx)
|
|
{
|
|
if (_inited) return;
|
|
|
|
//var uri = UserUri;
|
|
//if (uri != null && !uri.Host.EqualIgnoreCase("localhost", "127.0.0.1", "::1")) return;
|
|
|
|
var uri = ctx.Request.GetRawUrl();
|
|
if (uri == null || uri.Host.EqualIgnoreCase("localhost", "127.0.0.1", "::1")) return;
|
|
|
|
var url = uri.ToString();
|
|
var p = url.IndexOf('/', "https://".Length);
|
|
if (p > 0) url = url[..p];
|
|
|
|
UserUri = new Uri(url);
|
|
_inited = true;
|
|
|
|
// 保存外部访问地址
|
|
var set = StarSetting.Current;
|
|
if (url != set.AccessAddress)
|
|
{
|
|
XTrace.WriteLine("更新访问地址[{0}]", url);
|
|
|
|
set.AccessAddress = url;
|
|
set.Save();
|
|
}
|
|
|
|
// 更新地址
|
|
var registry = _serviceProvider.GetService<IRegistry>();
|
|
if (registry is AppClient app)
|
|
{
|
|
app.SetServerAddress(url);
|
|
}
|
|
}
|
|
}
|
|
} |