MeiRiYiCheng_1_old/YBDevice.NApi.Core/Startup.cs

249 lines
10 KiB
C#
Raw Permalink Normal View History

2025-07-16 17:14:38 +08:00
using Furion;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Senparc.CO2NET;
using Senparc.CO2NET.AspNet;
using Senparc.Weixin;
using Senparc.Weixin.Cache.CsRedis;
using Senparc.Weixin.Entities;
using Senparc.Weixin.MP;
using Senparc.Weixin.Open;
using Senparc.Weixin.RegisterServices;
using Senparc.Weixin.WxOpen;
using Serilog;
using System;
using YBDevice.CommonService;
using YBDevice.Core;
namespace YBDevice.NApi.Core
{
public class Startup : AppStartup
{
public void ConfigureServices(IServiceCollection services)
{
var configuration = App.Configuration;
services.AddHttpClient();
services.AddRemoteRequest(options =>
{
//头条接口
options.AddHttpClient("toutiao", c =>
{
c.BaseAddress = new Uri("https://developer.toutiao.com/");
});
});
services.AddCorsAccessor();
//添加CAP
services.AddCap(x =>
{
//配置rabbitmq支持
string port = configuration["RabbitmqSetting:Port"];
int p = Convert.ToInt32(port);
x.UseRabbitMQ(opt =>
{
opt.HostName = configuration["RabbitmqSetting:HostName"]; //配置ip地址
opt.Port = p;//配置端口
opt.UserName = configuration["RabbitmqSetting:UserName"];//配置用户名
opt.Password = configuration["RabbitmqSetting:Password"];//配置Miami
});
//配置sqlserver支持
x.UseSqlServer(configuration["RabbitmqSetting:DBConnection"]);
x.SucceedMessageExpiredAfter = 3600; //成功消息的过期时间,时间达到之后会删除,单位为秒
});
services.AddJwt<JwtHandler>(options =>
{
options.DefaultScheme = null;
});
services.AddControllersWithViews()
.AddInjectWithUnifyResult<RESTfulResultProvider>()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; //日期格式化
options.SerializerSettings.ContractResolver = new CustomContractResolver();
});
//如果部署在IIS上需要加上下面的配置
services.Configure<IISServerOptions>(options => options.AllowSynchronousIO = true);
#region IP
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Nirvana.Common.MyHttpContext.serviceCollection = services;
#endregion IP
//配置redis缓存
services.AddStackExchangeRedisCache(options =>
{
options.Configuration = configuration["RedisServer"];
});
services.AddSenparcWeixinServices(configuration);//Senparc.Weixin 注册(必须)
Senparc.Weixin.Config.ThrownWhenJsonResultFaild = false;
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,
IOptions<SenparcSetting> senparcSetting, IOptions<SenparcWeixinSetting> senparcWeixinSetting)
{
// 添加规范化结果状态码,需要在这里注册
app.UseUnifyResultStatusCodes();
//允许body重用
app.Use(next => context =>
{
context.Request.EnableBuffering();
return next(context);
});
//app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseSerilogRequestLogging(opts =>
{
opts.EnrichDiagnosticContext = LoggerHelper.EnrichFromRequest;
}); // 必须在 UseStaticFiles 和 UseRouting 之间,记录请求日志
app.UseRouting();
app.UseCorsAccessor();
#region
var registerService = app.UseSenparcGlobal(env, senparcSetting.Value, globalRegister =>
{
#region CO2NET
//配置全局使用Redis缓存按需独立
string redisConfigurationStr = UseRedis(senparcSetting.Value);
/*
* 1Redis Config.SenparcSetting.Cache_Redis_Configuration
/* 2 SetConfigurationOption Redis
*/
Senparc.CO2NET.Cache.CsRedis.Register.SetConfigurationOption(redisConfigurationStr);
//以下会立即将全局缓存设置为 Redis
Senparc.CO2NET.Cache.CsRedis.Register.UseKeyValueRedisNow();//键值对缓存策略
#endregion CO2NET
#region
globalRegister.RegisterTraceLog(ConfigTraceLog);//配置TraceLog
#endregion
}, true)
.UseSenparcWeixin(senparcWeixinSetting.Value, (weixinRegister, _) =>
{
var _wxservice = App.GetService<IWXService>();
App.GetService<ILoggerFactory>().CreateLogger("senparcWeixin").LogInformation($"senparcWeixinSetting:IsDebug:{senparcWeixinSetting.Value.IsDebug}");
#region 使
//注意:如果使用非本地缓存,而不执行本块注册代码,将会收到“当前扩展缓存策略没有进行注册”的异常
//微信的 Redis 缓存,如果不使用则注释掉(开启前必须保证配置有效,否则会抛错)
weixinRegister.UseSenparcWeixinCacheCsRedis();//CsRedis
weixinRegister
#endregion 使
#region
.RegisterMpAccount(senparcWeixinSetting.Value)// DPBMARK_END
#endregion
#region
#region
.RegisterWxOpenAccount(senparcWeixinSetting.Value)
.RegisterWxOpenAccount(senparcWeixinSetting.Value.Items["lxbusinessclient"], "lxbusinessclient")
.RegisterWxOpenAccount(senparcWeixinSetting.Value.Items["xcjbusinessclient"], "xcjbusinessclient")
.RegisterWxOpenAccount(senparcWeixinSetting.Value.Items["abbusinessclient"], "abbusinessclient")
#endregion
#region
.RegisterWxOpenAccount(senparcWeixinSetting.Value.Items["childresultclient"], "childresultclient")
#endregion
#endregion
#region
.RegisterOpenComponent(senparcWeixinSetting.Value,
//getComponentVerifyTicketFunc
async componentAppId =>
{
var component = await _wxservice.GetOpenTicketAsync(componentAppId);
return component;
},
//getAuthorizerRefreshTokenFunc
async (componentAppId, auhtorizerId) =>
{
return await _wxservice.GetRefreshToken(auhtorizerId, componentAppId);
},
//authorizerTokenRefreshedFunc
(componentAppId, auhtorizerId, refreshResult) =>
{
})
#endregion
;
});
#endregion
app.UseAuthentication();
app.UseAuthorization();
app.UseInject();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
/// <summary>
/// 配置微信跟踪日志(演示,按需)
/// </summary>
private void ConfigTraceLog()
{
//这里设为Debug状态时/App_Data/WeixinTraceLog/目录下会生成日志文件记录所有的API请求日志正式发布版本建议关闭
//如果全局的IsDebugSenparc.CO2NET.Config.IsDebug为false此处可以单独设置true否则自动为true
Senparc.CO2NET.Trace.SenparcTrace.SendCustomLog("系统日志", "系统启动");//只在Senparc.Weixin.Config.IsDebug = true的情况下生效
//全局自定义日志记录回调
Senparc.CO2NET.Trace.SenparcTrace.OnLogFunc = () =>
{
};
//当发生基于WeixinException的异常时触发
WeixinTrace.OnWeixinExceptionFunc = ex =>
{
//加入每次触发WeixinExceptionLog后需要执行的代码
//发送模板消息给管理员 -- DPBMARK Redis
var eventService = new EventService();
eventService.ConfigOnWeixinExceptionFunc(ex); // DPBMARK_END
};
}
/// <summary>
/// 判断当前配置是否满足使用 Redis根据是否已经修改了默认配置字符串判断
/// </summary>
/// <param name="senparcSetting"></param>
/// <returns></returns>
private string UseRedis(SenparcSetting senparcSetting)
{
string redisConfigurationStr = senparcSetting.Cache_Redis_Configuration;
return redisConfigurationStr;
}
}
}