You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
3.8 KiB
C#

using System.Text;
using DS.Module.Core;
using DS.Module.Core.Extensions;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using SqlSugar;
namespace DS.Module.MultiLanguage;
/// <summary>
/// 多语言中间件
/// </summary>
public class MultiLanguageMiddleware
{
private readonly RequestDelegate _next;
public IMultiLanguageService _invokeService;
private readonly IServiceProvider _serviceProvider;
private readonly SqlSugarScope db;
public MultiLanguageMiddleware(RequestDelegate next, IServiceProvider serviceProvider)
{
_next = next;
_serviceProvider = serviceProvider;
_invokeService = _serviceProvider.GetRequiredService<IMultiLanguageService>();
}
public async Task Invoke(HttpContext context)
{
if (context.Request.Path.HasValue
&&
(
context.Request.Path.Value.IndexOf("SignalR", StringComparison.InvariantCultureIgnoreCase) > -1
|| context.Request.Path.Value.IndexOf("swagger", StringComparison.InvariantCultureIgnoreCase) > -1
|| context.Request.Path.Value.IndexOf("HealthCheck", StringComparison.InvariantCultureIgnoreCase) > -1
)
)
{
await _next(context);
}
else
{
var api = context.Request.Path.ObjToString().TrimEnd('/').ToLower();
// 过滤,只有接口
if (api.Contains("api"))
{
using (var ms = new MemoryStream())
{
HttpResponse response = context.Response;
var originalResponseBody = response.Body;
using var newResponseBody = new MemoryStream();
response.Body = newResponseBody;
await _next(context);
newResponseBody.Seek(0, SeekOrigin.Begin);
var responseBodyText =
await new StreamReader(response.Body).ReadToEndAsync();
var msg = JsonConvert.DeserializeObject<DataResult>(responseBodyText);
if (msg.IsNotEmptyOrNull())
{
var type = context.Request.Headers["LanguageType"].FirstOrDefault();
if (type.IsNullOrEmpty())
{
type = "CN";
}
var serializerSettings = new JsonSerializerSettings
{
// 设置为驼峰命名
ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
};
if (msg.MultiCode.IsNotEmptyOrNull())
{
//多语言处理返回信息
var langugaeSet = _invokeService.GetMultiLanguageInfo(msg.MultiCode, type);
if (!langugaeSet.IsNullOrEmpty())
{
msg.Message = langugaeSet;
responseBodyText = JsonConvert.SerializeObject(msg,Formatting.None, serializerSettings);
}
}
}
byte[] array = Encoding.UTF8.GetBytes(responseBodyText);
using var newBodyStream = new MemoryStream(array);
newBodyStream.Seek(0, SeekOrigin.Begin);
response.ContentLength = newBodyStream.Length;
await newBodyStream.CopyToAsync(originalResponseBody);
}
}
}
}
}