using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http.Headers; using System.Net; using System.Text; using System.Threading.Tasks; using System.Security.Policy; using System.Text.Json; using Learn.Archives.Core.Model.Dto; using Microsoft.AspNetCore.Mvc.RazorPages; namespace Learn.Archives.Core.Common { public static class UserCenterServiceExpand { /// /// 添加 当前作用域登录用户信息 /// /// public static void AddUserCenterServiceExpand(this IServiceCollection services) { services.AddScoped(); } } /// /// 调用 UserCenter服务的接口 /// public class UserCenterService { private readonly IHttpClientFactory _httpClientFactory; public UserCenterService(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; } const string API_getpageuserlist = "back/users/getpageuserlist"; const string API_ImportJsonData = "back/users/importjsondata"; /// /// 请求用户中心 接口 /// /// /// public async Task> CallAPI_GetPageUserList(HttpContext context) { var res = await ForwardRequestAsync>>(API_getpageuserlist, context); if (res==null || res.Code != 200) Oh.Error(res.Message, res.Code); return res.Data; } /// /// 请求用户中心 接口 /// /// /// public async Task CallAPI_ImportJsonData(HttpContext context,object data) { var httpClient = _httpClientFactory.CreateClient(); var targetUri = new Uri(AppCommon.Config.UserCenterService.API +"/"+ API_ImportJsonData); var requestMessage = new HttpRequestMessage(new HttpMethod("POST"), targetUri); if (context.Request.Headers.TryGetValue("Authorization", out var authValues)) requestMessage.Headers.Authorization = AuthenticationHeaderValue.Parse(authValues.FirstOrDefault()); requestMessage.Content = new StringContent(data.ToJson(), Encoding.UTF8, "application/json"); var responseMessage = await httpClient.SendAsync(requestMessage, HttpCompletionOption.ResponseHeadersRead); var resStr = string.Empty; try { resStr= await responseMessage?.Content?.ReadAsStringAsync(); } catch (Exception ex) { return Oh.Error($"请求用户中心出现异常 {resStr} {ex.Message}"); } if(string.IsNullOrEmpty(resStr)) return Oh.Error($"请求用户中心出现异常 返回了空数据"); var res = JsonSerializer.Deserialize>(resStr); if (res == null || res.Code != 200) Oh.Error(res.Message, res.Code); return res.Data; } /// /// 转发请求 /// /// 用户中心API /// 上下文 /// public async Task ForwardRequestAsync(string url, HttpContext context) where T : class, new() { var httpClient = _httpClientFactory.CreateClient(); var Request = context.Request; try { // ========== 1. 准备目标请求 ========== var targetUri = new Uri(AppCommon.Config.UserCenterService.API+"/"+ url); // 创建 HttpRequestMessage,使用与当前请求相同的 HttpMethod var requestMessage = new HttpRequestMessage(new HttpMethod(Request.Method), targetUri); // ========== 2. 复制请求头 ========== // ========== 3. 处理请求体(Body)========== if (Request.Body != null && (Request.Method == "POST" || Request.Method == "PUT" || Request.Method == "PATCH")) { // 由于 Request.Body 只能读取一次,我们需要缓存它(ASP.NET Core 默认不缓存) // 如果你希望多次读取 Body,可以使用 EnableBuffering() 中间件,或者在这里直接读取并重新赋值 Request.EnableBuffering(); // 允许重新读取请求流 Request.Body.Position = 0; // 重置 Stream 位置,以便后续中间件或框架再次读取(如有必要) using var reader = new System.IO.StreamReader(Request.Body); var body = await reader.ReadToEndAsync(); if (!string.IsNullOrEmpty(body)) requestMessage.Content = new StringContent(body, Encoding.UTF8, Request.ContentType); } // ========== 4. 添加 Authorization 等自定义 Header(可选)========== if (Request.Headers.TryGetValue("Authorization", out var authValues)) requestMessage.Headers.Authorization = AuthenticationHeaderValue.Parse(authValues.FirstOrDefault()); // ========== 5. 发送请求到目标服务器 ========== var responseMessage = await httpClient.SendAsync(requestMessage, HttpCompletionOption.ResponseHeadersRead); var resStr = await responseMessage.Content?.ReadAsStringAsync(); return JsonSerializer.Deserialize(resStr); } catch { throw; } } } }