using System.Globalization;
using JNPF.API.Entry.Handlers;
using JNPF.Common.Core.Filter;
using JNPF.JsonSerialization;
using JNPF.UnifyResult;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.HttpOverrides;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
namespace Microsoft.Extensions.DependencyInjection;
///
/// OSS服务配置拓展.
///
public static class ConfigureMvcControllerExtensions
{
///
/// OSS服务配置.
///
///
///
public static IServiceCollection ConfigureMvcController(this IServiceCollection services)
{
services.AddControllers()
.AddMvcFilter()
.AddInjectWithUnifyResult()
.AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null)
.AddNewtonsoftJson(options =>
{
// 默认命名规则
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
// 设置时区为 UTC
options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
// 格式化json输出的日期格式
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
// 忽略空值
// options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
// 忽略循环引用
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
// 格式化json输出的日期格式为时间戳
// options.SerializerSettings.Converters.Add(new NewtonsoftDateTimeJsonConverter());
options.SerializerSettings.Converters.Add(new MyNewtonsoftDateTimeJsonConverter());//zhoukeda 2023.10.24
});
services.AddUnifyJsonOptions("special", new JsonSerializerSettings
{
// 默认命名规则
ContractResolver = new DefaultContractResolver(),
// 设置时区为 UTC
DateTimeZoneHandling = DateTimeZoneHandling.Utc,
// 格式化json输出的日期格式
DateFormatString = "yyyy-MM-dd HH:mm:ss",
});
// 配置Nginx转发获取客户端真实IP
// 注1:如果负载均衡不是在本机通过 Loopback 地址转发请求的,一定要加上options.KnownNetworks.Clear()和options.KnownProxies.Clear()
// 注2:如果设置环境变量 ASPNETCORE_FORWARDEDHEADERS_ENABLED 为 True,则不需要下面的配置代码
services.Configure(options =>
{
options.ForwardedHeaders = ForwardedHeaders.All;
options.KnownNetworks.Clear();
options.KnownProxies.Clear();
});
// Jwt处理程序
services.AddJwt(enableGlobalAuthorize: true, jwtBearerConfigure: options =>
{
// 实现 JWT 身份验证过程控制
options.Events = new JwtBearerEvents
{
// 添加读取 Token 的方式
OnMessageReceived = context =>
{
var httpContext = context.HttpContext;
// 判断请求是否包含 token 参数,如果有就设置给 Token
if (httpContext.Request.Query.ContainsKey("token"))
{
// 设置 Token
context.Token = httpContext.Request.Query["token"];
}
return Task.CompletedTask;
},
// Token 验证通过处理
OnTokenValidated = context =>
{
return Task.CompletedTask;
},
};
});
// 跨域
services.AddCorsAccessor();
// 注册远程请求
services.AddRemoteRequest();
// 视图引擎
services.AddViewEngine();
// 脱敏词汇检测
services.AddSensitiveDetection();
// WebSocket服务
services.AddWebSocketManager();
services.AddSession();
services.AddSingleton();
return services;
}
public class MyNewtonsoftDateTimeJsonConverter : NewtonsoftDateTimeJsonConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
bool flag = NewtonsoftDateTimeJsonConverter.IsNullable(objectType);
if (reader.TokenType == JsonToken.Null || string.IsNullOrEmpty(reader.Value.ToString()))
{
if (!flag)
throw new JsonSerializationException(string.Format((IFormatProvider)CultureInfo.InvariantCulture, "Cannot convert null value to {0}.", (object)objectType));
return (object)null;
}
long result = 0;
if (reader.TokenType == JsonToken.Integer)
result = (long)reader.Value;
else if (reader.TokenType == JsonToken.String)
{
if (!long.TryParse((string)reader.Value, out result))
return (object)Convert.ToDateTime(reader.Value.ToString());
return reader.TokenType == JsonToken.Date ? reader.Value : throw new JsonSerializationException(string.Format((IFormatProvider)CultureInfo.InvariantCulture, "Unexpected token parsing date. Expected Integer or String, got {0}.", (object)reader.TokenType));
}
if (result < 0L)
return (object)DateTime.Now;
try
{
DateTime dt = Convert.ToDateTime(reader.Value.ToString());
return dt;
}
catch (Exception e)
{
DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(result);
dateTimeOffset = dateTimeOffset.ToLocalTime();
DateTime dateTime = dateTimeOffset.DateTime;
return (flag ? Nullable.GetUnderlyingType(objectType) : objectType) == typeof(DateTimeOffset) ? (object)new DateTimeOffset(dateTime, TimeSpan.Zero) : (object)dateTime;
}
}
}
}