From ad63bd48b1619e7c3779eefdf1d6a32a222169da Mon Sep 17 00:00:00 2001 From: sunpengfei <i@angelzzz.com> Date: 星期二, 09 九月 2025 09:33:19 +0800 Subject: [PATCH] feat:开发 --- FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpUtils.cs | 168 ++++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 132 insertions(+), 36 deletions(-) diff --git a/FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpUtils.cs b/FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpUtils.cs index db7a2db..04199ce 100644 --- a/FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpUtils.cs +++ b/FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpUtils.cs @@ -1,77 +1,173 @@ -锘縰sing Consul; +锘縰sing Azure; +using Consul; using Furion; +using Furion.DatabaseAccessor; using Furion.FriendlyException; using Furion.HttpRemote; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Distributed; +using RabbitMQ.Client; +using RTools_NTS.Util; using System; using System.Collections.Generic; +using System.ComponentModel.Design; using System.Linq; +using System.Net.Http; +using System.Reflection; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.Core { - public class ResourceHttpUtils + public static class ResourceHttpUtils { - private readonly IDistributedCache distributedCache; - private readonly IHttpRemoteService httpRemoteService; - private readonly IConsulClient consulClient; - - public ResourceHttpUtils( - IDistributedCache distributedCache, - IHttpRemoteService httpRemoteService, - IConsulClient consulClient) + /// <summary> + /// 鍙戦�佽姹� + /// </summary> + /// <param name="request">璇锋眰鍙傛暟</param> + /// <param name="serviceName">鏈嶅姟鍚嶇О</param> + /// <param name="route">璺敱</param> + /// <param name="method">璇锋眰鏂瑰紡</param> + /// <param name="provider">璧勬簮鎻愪緵鑰�</param> + /// <param name="accessToken">璁块棶浠ょ墝</param> + /// <param name="refreshToken">鍒锋柊浠ょ墝</param> + /// <returns></returns> + public static async Task<string> SendHttpAsync( + this object request, + string serviceName, + string route, + EnumResourceMethod method, + EnumResourceHttpProvider? provider = null, + string accessToken = null, + string refreshToken = null) { - this.distributedCache = distributedCache; - this.httpRemoteService = httpRemoteService; - this.consulClient = consulClient; + serviceName = App.GetConfig<string>($"{serviceName}:ServiceName"); + var url = await GetUrl(serviceName, route); + var builder = HttpRequestBuilder.Create(method.GetHttpMethod(), url); + + if (method == EnumResourceMethod.Get) + builder = builder.WithQueryParameters(request); + else + builder = builder.SetJsonContent(request); + + if (accessToken.IsNotNull()) + { + builder = builder.WithHeader("Authorization", accessToken); + } + if (refreshToken.IsNotNull()) + { + builder = builder.WithHeader("X-Authorization", refreshToken); + } + + IResourceHttpProvider httpProvider = + provider == EnumResourceHttpProvider.SystemUser + ? new SystemUserResourceHttpProvider() + : provider == EnumResourceHttpProvider.ElectronSignServer + ? new ElectronSignServerResourceHttpProvider() + : provider == EnumResourceHttpProvider.ElectronSignServerCustomer + ? new ElectronSignServerCustomerResourceHttpProvider() + : new DefaultResourceHttpProvider(); + var response = await httpProvider.SendAsStringAsync(builder); + return response; } /// <summary> - /// 鍙戦�丠TTP璇锋眰 + /// 鍙戦�佽姹� /// </summary> /// <typeparam name="TRequest"></typeparam> /// <typeparam name="TResponse"></typeparam> /// <param name="request"></param> /// <param name="provider"></param> /// <returns></returns> - public async Task<TResponse> SendHttpAsync<TRequest, TResponse>( - TRequest request, - IResourceHttpProvider provider = null) - where TRequest : class, new() + public static async Task<TResponse> SendHttpAsync<TRequest, TResponse>( + this TRequest request, + EnumResourceHttpProvider? provider = null) { - var requestTypeFullName = typeof(TRequest).FullName; - - var jsonResourceModels = await distributedCache.GetStringAsync($"ResourceModel|{requestTypeFullName}"); - var resource = jsonResourceModels.JsonTo<ResourceModel>(); - var domain = await GetHealthyServiceDomain(resource); - var builder = HttpRequestBuilder.Create(resource.GetHttpMethod(), $"{domain}{resource.Route}"); - if (resource.Method == EnumResourceMethod.Get) - builder = builder.WithQueryParameters(request); - else - builder = builder.SetJsonContent(request); - provider = provider ?? new DefaultResourceHttpProvider(); - builder = provider.AddAuthentication(builder); - var response = await provider.SendAsAsync<TResponse>(httpRemoteService, builder); + var requestType = typeof(TRequest); + var resourceAttribute = requestType.GetCustomAttribute<ResourceAttribute>(); + if (resourceAttribute == null) throw Oops.Oh(EnumErrorCodeType.s400, "缂哄け璧勬簮鐗规��"); + var controller = resourceAttribute.Controllers.FirstOrDefault(); + var resourceControllerAttribute = controller.GetCustomAttribute<EnumResourceController, ResourceControllerAttribute>(); + if (resourceAttribute == null) throw Oops.Oh(EnumErrorCodeType.s400, "缂哄け鎺у埗鍣ㄧ壒鎬�"); + var serviceName = resourceControllerAttribute.Service.ToString(); + var route = resourceAttribute.Route; + var method = resourceAttribute.Method; + var requestXmlDoc = await requestType.GetXmlDocMemberAsync(); + if (route.IsNull() || method == EnumResourceMethod.None) + { + var resource = await Db.GetRepository<Resource>().AsQueryable().AsNoTracking() + .Where(it => + it.ServiceName == serviceName + && it.ControllerName == resourceControllerAttribute.ControllerName + && it.Code == requestXmlDoc.Name) + .Select(it => new + { + it.Route, + it.Method + }) + .FirstOrDefaultAsync(); + if (resource == null) throw Oops.Oh(EnumErrorCodeType.s404, "璧勬簮"); + route = resource.Route; + method = resource.Method; + } + var responseJson = await request.SendHttpAsync(serviceName, route, method, provider); + var response = responseJson.JsonTo<TResponse>(); return response; + } + + /// <summary> + /// 鑾峰彇璇锋眰鏂瑰紡 + /// </summary> + /// <param name="method"></param> + /// <returns></returns> + public static HttpMethod GetHttpMethod(this EnumResourceMethod method) + { + switch (method) + { + case EnumResourceMethod.Get: + return HttpMethod.Get; + case EnumResourceMethod.Post: + return HttpMethod.Post; + case EnumResourceMethod.Put: + return HttpMethod.Put; + case EnumResourceMethod.Delete: + return HttpMethod.Delete; + default: + throw Oops.Oh(EnumErrorCodeType.s400, "涓嶆敮鎸佺殑璇锋眰绫诲瀷"); + } + } + + /// <summary> + /// 鑾峰彇鍋ュ悍鏈嶅姟鍦板潃 + /// </summary> + /// <param name="serviceName"></param> + /// <param name="route"></param> + /// <returns></returns> + public static async Task<string> GetUrl(string serviceName, string route) + { + var domain = await GetHealthyServiceDomain(serviceName); + return $"{domain}{route}"; } /// <summary> /// 鑾峰彇鍋ュ悍鏈嶅姟鍩熷悕 /// </summary> - /// <param name="resource"></param> + /// <param name="serviceName"></param> /// <returns></returns> - public async Task<string> GetHealthyServiceDomain(ResourceModel resource) + public static async Task<string> GetHealthyServiceDomain(string serviceName) { - var queryResult = await consulClient.Health.Service(resource.ServiceName, null, true); + var env = App.GetConfig<string>("Environment"); + serviceName = $"{env}_{serviceName}"; + + var queryResult = await App.GetRequiredService<IConsulClient>().Health.Service(serviceName, null, true); if (queryResult.StatusCode != System.Net.HttpStatusCode.OK) - throw Oops.Oh(EnumErrorCodeType.s404, $"寰湇鍔resource.Service}"); + throw Oops.Oh(EnumErrorCodeType.s404, $"寰湇鍔serviceName}"); var domains = queryResult.Response .Select(s => $"http://{s.Service.Address}:{s.Service.Port}") .ToList(); if (domains.IsNull()) - throw Oops.Oh(EnumErrorCodeType.s404, $"寰湇鍔resource.Service}"); + throw Oops.Oh(EnumErrorCodeType.s404, $"寰湇鍔serviceName}"); // 杞閫夋嫨瀹炰緥 int randomIndex = new Random().Next(domains.Count); return domains[randomIndex]; -- Gitblit v1.9.1