/// <summary> /// YoYo Senparc CO2NET 全局缓存配置(按需) /// </summary> /// <param name="registerService"></param> /// <param name="applicationBuilder"></param> /// <param name="senparcSetting"></param> /// <param name="customCacheNamespace">当同一个分布式缓存同时服务于多个网站(应用程序池)时,可以使用命名空间将其隔离(非必须)</param> /// <param name="configRedisAction">配置全局使用Redis缓存(按需,独立),此函数返回结果为true将启用redis</param> /// <returns></returns> public static IRegisterService UseYoYoSenparcCO2NETGlobalCache( this IRegisterService registerService, IApplicationBuilder applicationBuilder, SenparcSetting senparcSetting, string customCacheNamespace = null, Func <SenparcSetting, bool> configRedisAction = null) { // 全局缓存配置(按需) if (!string.IsNullOrWhiteSpace(customCacheNamespace)) { // 当同一个分布式缓存同时服务于多个网站(应用程序池)时,可以使用命名空间将其隔离(非必须) registerService.ChangeDefaultCacheNamespace(customCacheNamespace); } // 配置全局使用Redis缓存 if (configRedisAction == null) { return(registerService); } // 回调函数,返回true表示使用redis if (configRedisAction(senparcSetting)) { applicationBuilder.UseSenparcWeixinCacheRedis(); } return(registerService); }
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { //引入EnableRequestRewind中间件 app.UseEnableRequestRewind(); app.UseSession(); app.UseWeb(env, Configuration, hosting); // 启动 CO2NET 全局注册,必须! //关于 UseSenparcGlobal() 的更多用法见 CO2NET Demo:https://github.com/Senparc/Senparc.CO2NET/blob/master/Sample/Senparc.CO2NET.Sample.netcore/Startup.cs var senparcSetting = new SenparcSetting() { IsDebug = true, DefaultCacheNamespace = "DefaultCache", Cache_Redis_Configuration = "",//redis1:6379 Cache_Memcached_Configuration = "", SenparcUnionAgentKey = "" }; var senparcWeixinSetting = new SenparcWeixinSetting() { IsDebug = true, EncodingAESKey = "", WeixinAppId = "wx8eff62aca23ebf87", WeixinAppSecret = "b224033b6b4bf36970deaf5aa846ab4d" }; //CO2NET 设置 IRegisterService register = RegisterService.Start(env, senparcSetting).UseSenparcGlobal(); register.ChangeDefaultCacheNamespace("DefaultCO2NETCache"); //app.UseSenparcWeixinCacheMemcached(); register.UseSenparcWeixin(senparcWeixinSetting, senparcSetting) .RegisterMpAccount(senparcWeixinSetting, "【盛派网络小助手】公众号"); }
/// <summary> /// 注册 RegisterService.Start() /// </summary> public static void RegisterServiceStart(bool autoScanExtensionCacheStrategies = false) { //注册 var mockEnv = new Mock <Microsoft.Extensions.Hosting.IHostEnvironment /*IHostingEnvironment*/>(); mockEnv.Setup(z => z.ContentRootPath).Returns(() => UnitTestHelper.RootPath); registerService = Senparc.CO2NET.AspNet.RegisterServices.RegisterService.Start(mockEnv.Object, _senparcSetting) .UseSenparcGlobal(autoScanExtensionCacheStrategies); registerService.ChangeDefaultCacheNamespace("Senparc.CO2NET Tests"); //配置全局使用Redis缓存(按需,独立) var redisConfigurationStr = _senparcSetting.Cache_Redis_Configuration; var useRedis = !string.IsNullOrEmpty(redisConfigurationStr) && redisConfigurationStr != "#{Cache_Redis_Configuration}#" /*默认值,不启用*/; if (useRedis)//这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的,这里的if条件可以忽略 { /* 说明: * 1、Redis 的连接字符串信息会从 Config.SenparcSetting.Cache_Redis_Configuration 自动获取并注册,如不需要修改,下方方法可以忽略 * /* 2、如需手动修改,可以通过下方 SetConfigurationOption 方法手动设置 Redis 链接信息(仅修改配置,不立即启用) */ Senparc.CO2NET.Cache.Redis.Register.SetConfigurationOption(redisConfigurationStr); Console.WriteLine("完成 Redis 设置"); //以下会立即将全局缓存设置为 Redis Senparc.CO2NET.Cache.Redis.Register.UseKeyValueRedisNow();//键值对缓存策略(推荐) Console.WriteLine("启用 Redis UseKeyValue 策略"); //Senparc.CO2NET.Cache.Redis.Register.UseHashRedisNow();//HashSet储存格式的缓存策略 //也可以通过以下方式自定义当前需要启用的缓存策略 //CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisObjectCacheStrategy.Instance);//键值对 //CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisHashSetObjectCacheStrategy.Instance);//HashSet } }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, IOptions <SenparcSetting> senparcSetting, IOptions <SenparcWeixinSetting> senparcWeixinSetting) { //引入EnableRequestRewind中间件 app.UseEnableRequestRewind(); app.UseSession(); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseBrowserLink(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); // 启动 CO2NET 全局注册,必须! IRegisterService register = RegisterService.Start(env, senparcSetting.Value) //关于 UseSenparcGlobal() 的更多用法见 CO2NET Demo:https://github.com/Senparc/Senparc.CO2NET/blob/master/Sample/Senparc.CO2NET.Sample.netcore/Startup.cs .UseSenparcGlobal(); //如果需要自动扫描自定义扩展缓存,可以这样使用: //register.UseSenparcGlobal(true); //如果需要指定自定义扩展缓存,可以这样用: //register.UseSenparcGlobal(false, GetExCacheStrategies); #region CO2NET 全局配置 #region 全局缓存配置(按需) //当同一个分布式缓存同时服务于多个网站(应用程序池)时,可以使用命名空间将其隔离(非必须) register.ChangeDefaultCacheNamespace("DefaultCO2NETCache"); #region 配置和使用 Redis -- DPBMARK Redis //配置全局使用Redis缓存(按需,独立) var redisConfigurationStr = senparcSetting.Value.Cache_Redis_Configuration; var useRedis = !string.IsNullOrEmpty(redisConfigurationStr) && redisConfigurationStr != "#{Cache_Redis_Configuration}#" /*默认值,不启用*/; if (useRedis)//这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的,这里的if条件可以忽略 { /* 说明: * 1、Redis 的连接字符串信息会从 Config.SenparcSetting.Cache_Redis_Configuration 自动获取并注册,如不需要修改,下方方法可以忽略 * /* 2、如需手动修改,可以通过下方 SetConfigurationOption 方法手动设置 Redis 链接信息(仅修改配置,不立即启用) */ Senparc.CO2NET.Cache.Redis.Register.SetConfigurationOption(redisConfigurationStr); //以下会立即将全局缓存设置为 Redis Senparc.CO2NET.Cache.Redis.Register.UseKeyValueRedisNow();//键值对缓存策略(推荐) //Senparc.CO2NET.Cache.Redis.Register.UseHashRedisNow();//HashSet储存格式的缓存策略 //也可以通过以下方式自定义当前需要启用的缓存策略 //CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisObjectCacheStrategy.Instance);//键值对 //CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisHashSetObjectCacheStrategy.Instance);//HashSet } //如果这里不进行Redis缓存启用,则目前还是默认使用内存缓存 #endregion // DPBMARK_END #region 配置和使用 Memcached -- DPBMARK Memcached //配置Memcached缓存(按需,独立) var memcachedConfigurationStr = senparcSetting.Value.Cache_Memcached_Configuration; var useMemcached = !string.IsNullOrEmpty(memcachedConfigurationStr) && memcachedConfigurationStr != "#{Cache_Memcached_Configuration}#"; if (useMemcached) //这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的,这里的if条件可以忽略 { app.UseEnyimMemcached(); /* 说明: * 1、Memcached 的连接字符串信息会从 Config.SenparcSetting.Cache_Memcached_Configuration 自动获取并注册,如不需要修改,下方方法可以忽略 * /* 2、如需手动修改,可以通过下方 SetConfigurationOption 方法手动设置 Memcached 链接信息(仅修改配置,不立即启用) */ Senparc.CO2NET.Cache.Memcached.Register.SetConfigurationOption(memcachedConfigurationStr); //以下会立即将全局缓存设置为 Memcached Senparc.CO2NET.Cache.Memcached.Register.UseMemcachedNow(); //也可以通过以下方式自定义当前需要启用的缓存策略 CacheStrategyFactory.RegisterObjectCacheStrategy(() => MemcachedObjectCacheStrategy.Instance); } #endregion // DPBMARK_END #endregion #region 注册日志(按需,建议) register.RegisterTraceLog(ConfigTraceLog);//配置TraceLog #endregion #endregion #region 微信相关配置 /* 微信配置开始 * * 建议按照以下顺序进行注册,尤其须将缓存放在第一位! */ //注册开始 #region 微信缓存(按需,必须在 register.UseSenparcWeixin() 之前) //微信的 Redis 缓存,如果不使用则注释掉(开启前必须保证配置有效,否则会抛错) -- DPBMARK Redis if (useRedis) { app.UseSenparcWeixinCacheRedis(); } // DPBMARK_END // 微信的 Memcached 缓存,如果不使用则注释掉(开启前必须保证配置有效,否则会抛错) -- DPBMARK Memcached if (useMemcached) { app.UseSenparcWeixinCacheMemcached(); } // DPBMARK_END #endregion //开始注册微信信息,必须! register.UseSenparcWeixin(senparcWeixinSetting.Value, senparcSetting.Value) //注意:上一行没有 ; 下面可接着写 .RegisterXX() #region 注册公众号或小程序(按需) //注册公众号(可注册多个) -- DPBMARK MP .RegisterMpAccount(senparcWeixinSetting.Value, "【盛派网络小助手】公众号") // DPBMARK_END //注册多个公众号或小程序(可注册多个) -- DPBMARK MiniProgram .RegisterWxOpenAccount(senparcWeixinSetting.Value, "【盛派网络小助手】小程序") // DPBMARK_END //除此以外,仍然可以在程序任意地方注册公众号或小程序: //AccessTokenContainer.Register(appId, appSecret, name);//命名空间:Senparc.Weixin.MP.Containers #endregion #region 注册企业号(按需) -- DPBMARK Work //注册企业微信(可注册多个) .RegisterWorkAccount(senparcWeixinSetting.Value, "【盛派网络】企业微信") //除此以外,仍然可以在程序任意地方注册企业微信: //AccessTokenContainer.Register(corpId, corpSecret, name);//命名空间:Senparc.Weixin.Work.Containers #endregion // DPBMARK_END #region 注册微信支付(按需) -- DPBMARK TenPay //注册旧微信支付版本(V2)(可注册多个) .RegisterTenpayOld(senparcWeixinSetting.Value, "【盛派网络小助手】公众号") //这里的 name 和第一个 RegisterMpAccount() 中的一致,会被记录到同一个 SenparcWeixinSettingItem 对象中 //注册最新微信支付版本(V3)(可注册多个) .RegisterTenpayV3(senparcWeixinSetting.Value, "【盛派网络小助手】公众号") //记录到同一个 SenparcWeixinSettingItem 对象中 #endregion // DPBMARK_END #region 注册微信第三方平台(按需) -- DPBMARK Open //注册第三方平台(可注册多个) .RegisterOpenComponent(senparcWeixinSetting.Value, //getComponentVerifyTicketFunc async componentAppId => { var dir = Path.Combine(ServerUtility.ContentRootMapPath("~/App_Data/OpenTicket")); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } var file = Path.Combine(dir, string.Format("{0}.txt", componentAppId)); using (var fs = new FileStream(file, FileMode.Open)) { using (var sr = new StreamReader(fs)) { var ticket = await sr.ReadToEndAsync(); return(ticket); } } }, //getAuthorizerRefreshTokenFunc async(componentAppId, auhtorizerId) => { var dir = Path.Combine(ServerUtility.ContentRootMapPath("~/App_Data/AuthorizerInfo/" + componentAppId)); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } var file = Path.Combine(dir, string.Format("{0}.bin", auhtorizerId)); if (!File.Exists(file)) { return(null); } using (Stream fs = new FileStream(file, FileMode.Open)) { var binFormat = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); var result = (RefreshAuthorizerTokenResult)binFormat.Deserialize(fs); return(result.authorizer_refresh_token); } }, //authorizerTokenRefreshedFunc (componentAppId, auhtorizerId, refreshResult) => { var dir = Path.Combine(ServerUtility.ContentRootMapPath("~/App_Data/AuthorizerInfo/" + componentAppId)); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } var file = Path.Combine(dir, string.Format("{0}.bin", auhtorizerId)); using (Stream fs = new FileStream(file, FileMode.Create)) { //这里存了整个对象,实际上只存RefreshToken也可以,有了RefreshToken就能刷新到最新的AccessToken var binFormat = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); binFormat.Serialize(fs, refreshResult); fs.Flush(); } }, "【盛派网络】开放平台") //除此以外,仍然可以在程序任意地方注册开放平台: //ComponentContainer.Register();//命名空间:Senparc.Weixin.Open.Containers #endregion // DPBMARK_END ; /* 微信配置结束 */ #endregion }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime appLifetime, IOptions <Dictionary <string, string> > options, IOptions <SenparcSetting> senparcSetting, IOptions <SenparcWeixinSetting> senparcWeixinSetting) { //if (env.IsDevelopment()) //{ // app.UseDeveloperExceptionPage(); // // app.AddRazorRuntimeCompilation(); //} //else //{ // app.UseExceptionHandler("/Home/Error"); // // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. // app.UseHsts(); //} app.UseCookiePolicy(); app.UseHttpsRedirection(); //添加新的媒体文件类型,静态文件路由 app.UseAtlassDefaultFiles(options); app.UseRouting(); #region 自定义中间件 app.UseMiddleware <AtlassHttpRequestMiddleware>(); //app.UseMiddleware(typeof(AtlassExceptionMiddlerware)); #endregion app.UseAuthorization(); app.UseSession(); app.UseEasyCachingResponseCaching(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapControllerRoute(name: "areaRoute", pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"); }); //启动hangfire服务和面板 app.UseHangfireServer(new BackgroundJobServerOptions { Queues = new[] { "default" } }); app.UseHangfireDashboard(); //app.UseHangfireDashboard("/hangfire", new DashboardOptions() //{ // Authorization = new[] { new HangfireAuthorizeFilter() } //}); //关于 UseSenparcGlobal() 的更多用法见 CO2NET Demo: //https://github.com/Senparc/Senparc.CO2NET/blob/master/Sample/Senparc.CO2NET.Sample.netcore/Startup.cs IRegisterService register = RegisterService.Start(senparcSetting.Value) .UseSenparcGlobal(); register.ChangeDefaultCacheNamespace("DefaultCO2NETCache"); register.UseSenparcWeixin(senparcWeixinSetting.Value, senparcSetting.Value) #region 注册公众号(按需) //注册公众号(可注册多个) -- DPBMARK MP .RegisterMpAccount(senparcWeixinSetting.Value, "doctor_platform_mp") // DPBMARK_END //注册最新微信支付版本(V3)(可注册多个) .RegisterTenpayV3(senparcWeixinSetting.Value, "doctor_platform_tenpay"); //记录到同一个 SenparcWeixinSettingItem 对象中 #endregion //应用程序启动后 appLifetime.ApplicationStarted.Register(() => { try { GlobalParamsDto.WebRoot = env.WebRootPath; //SugarDbConn.DbConnectStr = this.Configuration.GetSection("DbConn:mysqlConn").Value; //为数据库连接字符串赋值 GlobalParamsDto.Host = this.Configuration.GetSection("WebHost:Host").Value; //初始化栏目相关的缓存 CmsCacheInit.Init(); } catch (Exception e) { LogNHelper.Exception(e); } }); }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, IOptions <SenparcWeixinSetting> senparcWeixinSetting) { //引入EnableRequestRewind中间件 app.UseEnableRequestRewind(); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseBrowserLink(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); #region 提供网站根目录(当前 Sample 用到,和 SDK 无关) if (env.ContentRootPath != null) { Senparc.Weixin.MP.Sample.CommonService.Utilities.Server.AppDomainAppPath = env.ContentRootPath; // env.ContentRootPath; } Senparc.Weixin.MP.Sample.CommonService.Utilities.Server.WebRootPath = env.WebRootPath; // env.ContentRootPath; #endregion var isDebug = true;//当前是否是Debug状态 IRegisterService register = RegisterService.Start(env, isDebug); #region 注册线程(必须) 在Start()中已经自动注册,此处也可以省略,仅作演示 register.RegisterThreads(); //启动线程,RegisterThreads()也可以省略,在RegisterService.Start()中已经自动注册 #endregion #region 缓存配置(按需) // 当同一个分布式缓存同时服务于多个网站(应用程序池)时,可以使用命名空间将其隔离(非必须) register.ChangeDefaultCacheNamespace("DefaultWeixinCache"); //配置Redis缓存(按需,独立) var redisConfigurationStr = senparcWeixinSetting.Value.Cache_Redis_Configuration; var useRedis = !string.IsNullOrEmpty(redisConfigurationStr) && redisConfigurationStr != "Redis配置"; if (useRedis)//这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的 { CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisObjectCacheStrategy.Instance); //如果不进行任何设置,则默认使用内存缓存 } //配置Memcached缓存(按需,独立) //这里配置的是 CO2NET 的 Memcached 缓存(如果执行了下面的 app.UseSenparcWeixinCacheMemcached(), //会自动包含本步骤,这一步注册可以忽略) var useMemcached = false; app.UseWhen(h => useMemcached, a => a.UseEnyimMemcached()); #endregion #region 注册日志(按需) register.RegisterTraceLog(ConfigTraceLog);//配置TraceLog #endregion #region 微信相关配置 /* 微信配置开始 * * 建议按照以下顺序进行注册,尤其须将缓存放在第一位! */ //注册开始 #region 微信缓存(按需,必须在 register.UseSenparcWeixin() 之前) // 微信的 Memcached 缓存,如果不使用则注释掉(开启前必须保证配置有效,否则会抛错) if (useMemcached) { app.UseSenparcWeixinCacheMemcached(); } //app.UseWhen(h => useMemcached, a => a.UseSenparcWeixinCacheMemcached());//如果连接而配置未生效,不能这么使用 //微信的 Redis 缓存,如果不使用则注释掉(开启前必须保证配置有效,否则会抛错) if (useRedis) { app.UseSenparcWeixinCacheRedis(); } //app.UseWhen(h => useRedis, a => a.UseSenparcWeixinCacheRedis());//如果连接而配置未生效,不能这么使用 #endregion //开始注册微信信息 register.UseSenparcWeixin(senparcWeixinSetting.Value, isDebug /*此处为单独用于微信的调试状态*/, () => GetExContainerCacheStrategies(senparcWeixinSetting.Value)) //注意:这里没有 ; 下面可接着写 #region 注册公众号或小程序(按需) //注册公众号 .RegisterMpAccount( senparcWeixinSetting.Value.WeixinAppId, senparcWeixinSetting.Value.WeixinAppSecret, "【盛派网络小助手】公众号") //注册多个公众号或小程序 .RegisterMpAccount( senparcWeixinSetting.Value.WxOpenAppId, senparcWeixinSetting.Value.WxOpenAppSecret, "【盛派互动】小程序") #endregion #region 注册企业号(按需) //注册企业号 .RegisterWorkAccount( senparcWeixinSetting.Value.WeixinCorpId, senparcWeixinSetting.Value.WeixinCorpSecret, "【盛派网络】企业微信") //还可注册任意多个企业号 #endregion #region 注册微信支付(按需) //注册旧微信支付版本(V2) .RegisterTenpayOld(() => { //提供微信支付信息 var weixinPay_PartnerId = senparcWeixinSetting.Value.WeixinPay_PartnerId; var weixinPay_Key = senparcWeixinSetting.Value.WeixinPay_Key; var weixinPay_AppId = senparcWeixinSetting.Value.WeixinPay_AppId; var weixinPay_AppKey = senparcWeixinSetting.Value.WeixinPay_AppKey; var weixinPay_TenpayNotify = senparcWeixinSetting.Value.WeixinPay_TenpayNotify; var weixinPayInfo = new TenPayInfo(weixinPay_PartnerId, weixinPay_Key, weixinPay_AppId, weixinPay_AppKey, weixinPay_TenpayNotify); return(weixinPayInfo); }) //注册最新微信支付版本(V3) .RegisterTenpayV3(() => { //提供微信支付信息 var tenPayV3_MchId = senparcWeixinSetting.Value.TenPayV3_MchId; var tenPayV3_Key = senparcWeixinSetting.Value.TenPayV3_Key; var tenPayV3_AppId = senparcWeixinSetting.Value.TenPayV3_AppId; var tenPayV3_AppSecret = senparcWeixinSetting.Value.TenPayV3_AppSecret; var tenPayV3_TenpayNotify = senparcWeixinSetting.Value.TenPayV3_TenpayNotify; var tenPayV3Info = new TenPayV3Info(tenPayV3_AppId, tenPayV3_AppSecret, tenPayV3_MchId, tenPayV3_Key, tenPayV3_TenpayNotify); return(tenPayV3Info); }) #endregion #region 注册微信第三方平台(按需) .RegisterOpenComponent( senparcWeixinSetting.Value.Component_Appid, senparcWeixinSetting.Value.Component_Secret, //getComponentVerifyTicketFunc componentAppId => { var dir = Path.Combine(Server.GetMapPath("~/App_Data/OpenTicket")); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } var file = Path.Combine(dir, string.Format("{0}.txt", componentAppId)); using (var fs = new FileStream(file, FileMode.Open)) { using (var sr = new StreamReader(fs)) { var ticket = sr.ReadToEnd(); return(ticket); } } }, //getAuthorizerRefreshTokenFunc (componentAppId, auhtorizerId) => { var dir = Path.Combine(Server.GetMapPath("~/App_Data/AuthorizerInfo/" + componentAppId)); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } var file = Path.Combine(dir, string.Format("{0}.bin", auhtorizerId)); if (!File.Exists(file)) { return(null); } using (Stream fs = new FileStream(file, FileMode.Open)) { var binFormat = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); var result = (RefreshAuthorizerTokenResult)binFormat.Deserialize(fs); return(result.authorizer_refresh_token); } }, //authorizerTokenRefreshedFunc (componentAppId, auhtorizerId, refreshResult) => { var dir = Path.Combine(Server.GetMapPath("~/App_Data/AuthorizerInfo/" + componentAppId)); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } var file = Path.Combine(dir, string.Format("{0}.bin", auhtorizerId)); using (Stream fs = new FileStream(file, FileMode.Create)) { //这里存了整个对象,实际上只存RefreshToken也可以,有了RefreshToken就能刷新到最新的AccessToken var binFormat = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); binFormat.Serialize(fs, refreshResult); fs.Flush(); } }, "【盛派网络】开放平台") #endregion ; /* 微信配置结束 */ #endregion }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, IOptions <SenparcSetting> senparcSetting, IOptions <SenparcWeixinSetting> senparcWeixinSetting) { //引入EnableRequestRewind中间件 app.UseEnableRequestRewind(); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseBrowserLink(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); #region 提供网站根目录(当前 Sample 用到,和 SDK 无关) if (env.ContentRootPath != null) { Senparc.Weixin.MP.Sample.CommonService.Utilities.Server.AppDomainAppPath = env.ContentRootPath; // env.ContentRootPath; } Senparc.Weixin.MP.Sample.CommonService.Utilities.Server.WebRootPath = env.WebRootPath; // env.ContentRootPath; #endregion // 启动 CO2NET 全局注册,必须! IRegisterService register = RegisterService.Start(env, senparcSetting.Value) .UseSenparcGlobal(false, () => GetExCacheStrategies(senparcSetting.Value)); //如果需要自动扫描自定义扩展缓存,可以这样使用: //register.UseSenparcWeixin(true); //如果需要指定自定义扩展缓存,可以这样用: //register.UseSenparcWeixin(false, GetExCacheStrategies); #region CO2NET 全局配置 #region 注册线程,在 RegisterService.Start() 中已经自动注册,此处也可以省略,仅作演示 register.RegisterThreads(); //启动线程,RegisterThreads()也可以省略,在RegisterService.Start()中已经自动注册 #endregion #region 缓存配置(按需) // 当同一个分布式缓存同时服务于多个网站(应用程序池)时,可以使用命名空间将其隔离(非必须) register.ChangeDefaultCacheNamespace("DefaultCO2NETCache"); //配置全局使用Redis缓存(按需,独立) var redisConfigurationStr = senparcSetting.Value.Cache_Redis_Configuration; var useRedis = !string.IsNullOrEmpty(redisConfigurationStr) && redisConfigurationStr != "Redis配置"; if (useRedis)//这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的 { //设置Redis链接信息,并在全局立即启用Redis缓存。 register.RegisterCacheRedis(redisConfigurationStr, redisConfiguration => RedisObjectCacheStrategy.Instance); //此外还可以通过这种方式修改 Redis 链接信息(不立即启用): //RedisManager.ConfigurationOption = redisConfigurationStr; //以下会立即将全局缓存设置为Redis(不修改配置)。 //如果要使用其他缓存,同样可以在任意地方使用这个方法,修改 RedisObjectCacheStrategy 为其他缓存策略 //CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisObjectCacheStrategy.Instance); } //如果这里不进行Redis缓存启用,则目前还是默认使用内存缓存 //配置Memcached缓存(按需,独立) //这里配置的是 CO2NET 的 Memcached 缓存(如果执行了下面的 app.UseSenparcWeixinCacheMemcached(), //会自动包含本步骤,这一步注册可以忽略) var useMemcached = false; app.UseWhen(h => useMemcached, a => { a.UseEnyimMemcached(); //确保Memcached连接可用后,启用下面的做法 //var memcachedConnStr = senparcSetting.Value.Cache_Memcached_Configuration; //var memcachedConnDic = new Dictionary<string, int>() {/*进行配置 { "localhost", 9101 }*/ };//可以由 memcachedConnStr 分割得到,或直接填写 //register.RegisterCacheMemcached(memcachedConnDic, memcachedConfig => MemcachedObjectCacheStrategy.Instance); }); #endregion #region 注册日志(按需,建议) register.RegisterTraceLog(ConfigTraceLog);//配置TraceLog #endregion #endregion #region 微信相关配置 /* 微信配置开始 * * 建议按照以下顺序进行注册,尤其须将缓存放在第一位! */ //注册开始 #region 微信缓存(按需,必须在 register.UseSenparcWeixin() 之前) // 微信的 Memcached 缓存,如果不使用则注释掉(开启前必须保证配置有效,否则会抛错) if (useMemcached) { app.UseSenparcWeixinCacheMemcached(); } //app.UseWhen(h => useMemcached, a => a.UseSenparcWeixinCacheMemcached());//如果连接而配置未生效,不能这么使用 //微信的 Redis 缓存,如果不使用则注释掉(开启前必须保证配置有效,否则会抛错) if (useRedis) { app.UseSenparcWeixinCacheRedis(); } //app.UseWhen(h => useRedis, a => a.UseSenparcWeixinCacheRedis());//如果连接而配置未生效,不能这么使用 #endregion //开始注册微信信息,必须! register.UseSenparcWeixin(senparcWeixinSetting.Value, senparcSetting.Value) //注意:上一行没有 ; 下面可接着写 .RegisterXX() #region 注册公众号或小程序(按需) //注册公众号 .RegisterMpAccount( senparcWeixinSetting.Value.WeixinAppId, senparcWeixinSetting.Value.WeixinAppSecret, "【盛派网络小助手】公众号") //注册多个公众号或小程序 .RegisterMpAccount( senparcWeixinSetting.Value.WxOpenAppId, senparcWeixinSetting.Value.WxOpenAppSecret, "【盛派网络小助手】小程序") //注意:小程序和公众号的AppId/Secret属于并列关系,这里name需要区分开 #endregion #region 注册企业号(按需) //注册企业号 .RegisterWorkAccount( senparcWeixinSetting.Value.WeixinCorpId, senparcWeixinSetting.Value.WeixinCorpSecret, "【盛派网络】企业微信") //还可注册任意多个企业号 #endregion #region 注册微信支付(按需) //注册旧微信支付版本(V2) .RegisterTenpayOld(() => { //提供微信支付(旧版本)信息 var weixinPayInfo = new TenPayInfo(senparcWeixinSetting.Value); return(weixinPayInfo); }, "【盛派网络小助手】公众号"//这里的 name 和第一个 RegisterMpAccount() 中的一致,会被记录到同一个 SenparcWeixinSettingItem 对象中 ) //注册最新微信支付版本(V3) .RegisterTenpayV3(() => { //提供微信支付(新版本 V3)信息 var tenPayV3Info = new TenPayV3Info(senparcWeixinSetting.Value); return(tenPayV3Info); }, "【盛派网络小助手】公众号") //记录到同一个 SenparcWeixinSettingItem 对象中 #endregion #region 注册微信第三方平台(按需) .RegisterOpenComponent( senparcWeixinSetting.Value.Component_Appid, senparcWeixinSetting.Value.Component_Secret, //getComponentVerifyTicketFunc componentAppId => { var dir = Path.Combine(Server.GetMapPath("~/App_Data/OpenTicket")); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } var file = Path.Combine(dir, string.Format("{0}.txt", componentAppId)); using (var fs = new FileStream(file, FileMode.Open)) { using (var sr = new StreamReader(fs)) { var ticket = sr.ReadToEnd(); return(ticket); } } }, //getAuthorizerRefreshTokenFunc (componentAppId, auhtorizerId) => { var dir = Path.Combine(Server.GetMapPath("~/App_Data/AuthorizerInfo/" + componentAppId)); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } var file = Path.Combine(dir, string.Format("{0}.bin", auhtorizerId)); if (!File.Exists(file)) { return(null); } using (Stream fs = new FileStream(file, FileMode.Open)) { var binFormat = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); var result = (RefreshAuthorizerTokenResult)binFormat.Deserialize(fs); return(result.authorizer_refresh_token); } }, //authorizerTokenRefreshedFunc (componentAppId, auhtorizerId, refreshResult) => { var dir = Path.Combine(Server.GetMapPath("~/App_Data/AuthorizerInfo/" + componentAppId)); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } var file = Path.Combine(dir, string.Format("{0}.bin", auhtorizerId)); using (Stream fs = new FileStream(file, FileMode.Create)) { //这里存了整个对象,实际上只存RefreshToken也可以,有了RefreshToken就能刷新到最新的AccessToken var binFormat = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); binFormat.Serialize(fs, refreshResult); fs.Flush(); } }, "【盛派网络】开放平台") #endregion ; /* 微信配置结束 */ #endregion }
static void Main(string[] args) { var dt1 = SystemTime.Now; var configBuilder = new ConfigurationBuilder(); configBuilder.AddJsonFile("appsettings.json", false, false); Console.WriteLine("完成 appsettings.json 添加"); var config = configBuilder.Build(); Console.WriteLine("完成 ServiceCollection 和 ConfigurationBuilder 初始化"); //更多绑定操作参见:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-2.2 var senparcSetting = new SenparcSetting(); config.GetSection("SenparcSetting").Bind(senparcSetting); var services = new ServiceCollection(); services.AddMemoryCache();//使用本地缓存必须添加 /* * CO2NET 是从 Senparc.Weixin 分离的底层公共基础模块,经过了长达 6 年的迭代优化,稳定可靠。 * 关于 CO2NET 在所有项目中的通用设置可参考 CO2NET 的 Sample: * https://github.com/Senparc/Senparc.CO2NET/blob/master/Sample/Senparc.CO2NET.Sample.netcore/Startup.cs */ services.AddSenparcGlobalServices(config);//Senparc.CO2NET 全局注册 Console.WriteLine("完成 AddSenparcGlobalServices 注册"); // 启动 CO2NET 全局注册,必须! IRegisterService register = RegisterService.Start(senparcSetting) //关于 UseSenparcGlobal() 的更多用法见 CO2NET Demo:https://github.com/Senparc/Senparc.CO2NET/blob/master/Sample/Senparc.CO2NET.Sample.netcore/Startup.cs .UseSenparcGlobal(); Console.WriteLine("完成 RegisterService.Start().UseSenparcGlobal() 启动设置"); Console.WriteLine($"设定程序目录为:{Senparc.CO2NET.Config.RootDictionaryPath}"); #region CO2NET 全局配置 #region 全局缓存配置(按需) //当同一个分布式缓存同时服务于多个网站(应用程序池)时,可以使用命名空间将其隔离(非必须) register.ChangeDefaultCacheNamespace("DefaultCO2NETCache"); Console.WriteLine($"默认缓存命名空间替换为:{CO2NET.Config.DefaultCacheNamespace}"); #region 配置和使用 Redis -- DPBMARK Redis //配置全局使用Redis缓存(按需,独立) var redisConfigurationStr = senparcSetting.Cache_Redis_Configuration; var useRedis = !string.IsNullOrEmpty(redisConfigurationStr) && redisConfigurationStr != "#{Cache_Redis_Configuration}#" /*默认值,不启用*/; if (useRedis)//这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的,这里的if条件可以忽略 { /* 说明: * 1、Redis 的连接字符串信息会从 Config.SenparcSetting.Cache_Redis_Configuration 自动获取并注册,如不需要修改,下方方法可以忽略 * /* 2、如需手动修改,可以通过下方 SetConfigurationOption 方法手动设置 Redis 链接信息(仅修改配置,不立即启用) */ Senparc.CO2NET.Cache.Redis.Register.SetConfigurationOption(redisConfigurationStr); Console.WriteLine("完成 Redis 设置"); //以下会立即将全局缓存设置为 Redis Senparc.CO2NET.Cache.Redis.Register.UseKeyValueRedisNow();//键值对缓存策略(推荐) Console.WriteLine("启用 Redis UseKeyValue 策略"); //Senparc.CO2NET.Cache.Redis.Register.UseHashRedisNow();//HashSet储存格式的缓存策略 //也可以通过以下方式自定义当前需要启用的缓存策略 //CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisObjectCacheStrategy.Instance);//键值对 //CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisHashSetObjectCacheStrategy.Instance);//HashSet } //如果这里不进行Redis缓存启用,则目前还是默认使用内存缓存 #endregion // DPBMARK_END #region 配置和使用 Memcached -- DPBMARK Memcached //配置Memcached缓存(按需,独立) var memcachedConfigurationStr = senparcSetting.Cache_Memcached_Configuration; var useMemcached = !string.IsNullOrEmpty(memcachedConfigurationStr) && memcachedConfigurationStr != "#{Cache_Memcached_Configuration}#"; if (useMemcached) //这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的,这里的if条件可以忽略 { /* 说明: * 1、Memcached 的连接字符串信息会从 Config.SenparcSetting.Cache_Memcached_Configuration 自动获取并注册,如不需要修改,下方方法可以忽略 * /* 2、如需手动修改,可以通过下方 SetConfigurationOption 方法手动设置 Memcached 链接信息(仅修改配置,不立即启用) */ Senparc.CO2NET.Cache.Memcached.Register.SetConfigurationOption(memcachedConfigurationStr); Console.WriteLine("完成 Memcached 设置"); //以下会立即将全局缓存设置为 Memcached Senparc.CO2NET.Cache.Memcached.Register.UseMemcachedNow(); Console.WriteLine("启用 Memcached UseKeyValue 策略"); //也可以通过以下方式自定义当前需要启用的缓存策略 CacheStrategyFactory.RegisterObjectCacheStrategy(() => MemcachedObjectCacheStrategy.Instance); Console.WriteLine("立即启用 Memcached 策略"); } #endregion // DPBMARK_END #endregion #region 注册日志(按需,建议) register.RegisterTraceLog(ConfigTraceLog);//配置TraceLog #endregion #endregion Console.WriteLine("Hello CO2NET!"); Console.WriteLine($"Total initialization time: {SystemTime.DiffTotalMS(dt1)}ms"); Console.WriteLine($"当前缓存策略: {CacheStrategyFactory.GetObjectCacheStrategyInstance()}"); Console.WriteLine($"SenparcSetting: {Config.SenparcSetting.ToJson(true)}"); Console.ReadLine(); }
static void Main(string[] args) { var dt1 = SystemTime.Now; var configBuilder = new ConfigurationBuilder(); configBuilder.AddJsonFile("appsettings.json", false, false); Console.WriteLine("完成 appsettings.json 添加"); var config = configBuilder.Build(); Console.WriteLine("完成 ServiceCollection 和 ConfigurationBuilder 初始化"); //更多绑定操作参见:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-2.2 var senparcSetting = new SenparcSetting(); var senparcWeixinSetting = new SenparcWeixinSetting(); config.GetSection("SenparcSetting").Bind(senparcSetting); config.GetSection("SenparcWeixinSetting").Bind(senparcWeixinSetting); var services = new ServiceCollection(); services.AddMemoryCache();//使用本地缓存必须添加 /* * CO2NET 是从 Senparc.Weixin 分离的底层公共基础模块,经过了长达 6 年的迭代优化,稳定可靠。 * 关于 CO2NET 在所有项目中的通用设置可参考 CO2NET 的 Sample: * https://github.com/Senparc/Senparc.CO2NET/blob/master/Sample/Senparc.CO2NET.Sample.netcore/Startup.cs */ services.AddSenparcGlobalServices(config);//Senparc.CO2NET 全局注册 Console.WriteLine("完成 AddSenparcGlobalServices 注册"); //输出 JSON 校验 //var jsonSerializerSettings = new Newtonsoft.Json.JsonSerializerSettings() { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore }; //Console.WriteLine($"SenparcSetting:{senparcSetting.ToJson(true, jsonSerializerSettings)}"); //Console.WriteLine($"SenparcWeixinSetting:{senparcWeixinSetting.ToJson(true,jsonSerializerSettings)}"); // 启动 CO2NET 全局注册,必须! IRegisterService register = RegisterService.Start(senparcSetting) //关于 UseSenparcGlobal() 的更多用法见 CO2NET Demo:https://github.com/Senparc/Senparc.CO2NET/blob/master/Sample/Senparc.CO2NET.Sample.netcore/Startup.cs .UseSenparcGlobal(); Console.WriteLine("完成 RegisterService.Start().UseSenparcGlobal() 启动设置"); Console.WriteLine($"设定程序目录为:{Senparc.CO2NET.Config.RootDictionaryPath}"); #region CO2NET 全局配置 #region 全局缓存配置(按需) //当同一个分布式缓存同时服务于多个网站(应用程序池)时,可以使用命名空间将其隔离(非必须) register.ChangeDefaultCacheNamespace("DefaultCO2NETCache"); Console.WriteLine($"默认缓存命名空间替换为:{CO2NET.Config.DefaultCacheNamespace}"); #region 配置和使用 Redis -- DPBMARK Redis //配置全局使用Redis缓存(按需,独立) var redisConfigurationStr = senparcSetting.Cache_Redis_Configuration; var useRedis = !string.IsNullOrEmpty(redisConfigurationStr) && redisConfigurationStr != "#{Cache_Redis_Configuration}#" /*默认值,不启用*/; if (useRedis)//这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的,这里的if条件可以忽略 { /* 说明: * 1、Redis 的连接字符串信息会从 Config.SenparcSetting.Cache_Redis_Configuration 自动获取并注册,如不需要修改,下方方法可以忽略 * /* 2、如需手动修改,可以通过下方 SetConfigurationOption 方法手动设置 Redis 链接信息(仅修改配置,不立即启用) */ Senparc.CO2NET.Cache.Redis.Register.SetConfigurationOption(redisConfigurationStr); Console.WriteLine("完成 Redis 设置"); //以下会立即将全局缓存设置为 Redis Senparc.CO2NET.Cache.Redis.Register.UseKeyValueRedisNow();//键值对缓存策略(推荐) Console.WriteLine("启用 Redis UseKeyValue 策略"); //Senparc.CO2NET.Cache.Redis.Register.UseHashRedisNow();//HashSet储存格式的缓存策略 //也可以通过以下方式自定义当前需要启用的缓存策略 //CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisObjectCacheStrategy.Instance);//键值对 //CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisHashSetObjectCacheStrategy.Instance);//HashSet } //如果这里不进行Redis缓存启用,则目前还是默认使用内存缓存 #endregion // DPBMARK_END #region 配置和使用 Memcached -- DPBMARK Memcached //配置Memcached缓存(按需,独立) var memcachedConfigurationStr = senparcSetting.Cache_Memcached_Configuration; var useMemcached = !string.IsNullOrEmpty(memcachedConfigurationStr) && memcachedConfigurationStr != "#{Cache_Memcached_Configuration}#"; if (useMemcached) //这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的,这里的if条件可以忽略 { /* 说明: * 1、Memcached 的连接字符串信息会从 Config.SenparcSetting.Cache_Memcached_Configuration 自动获取并注册,如不需要修改,下方方法可以忽略 * /* 2、如需手动修改,可以通过下方 SetConfigurationOption 方法手动设置 Memcached 链接信息(仅修改配置,不立即启用) */ Senparc.CO2NET.Cache.Memcached.Register.SetConfigurationOption(memcachedConfigurationStr); Console.WriteLine("完成 Memcached 设置"); //以下会立即将全局缓存设置为 Memcached Senparc.CO2NET.Cache.Memcached.Register.UseMemcachedNow(); Console.WriteLine("启用 Memcached UseKeyValue 策略"); //也可以通过以下方式自定义当前需要启用的缓存策略 CacheStrategyFactory.RegisterObjectCacheStrategy(() => MemcachedObjectCacheStrategy.Instance); Console.WriteLine("立即启用 Memcached 策略"); } #endregion // DPBMARK_END #endregion #region 注册日志(按需,建议) register.RegisterTraceLog(ConfigTraceLog);//配置TraceLog #endregion #endregion #region 微信相关配置 /* 微信配置开始 * * 建议按照以下顺序进行注册,尤其须将缓存放在第一位! */ //注册开始 //开始注册微信信息,必须! register.UseSenparcWeixin(senparcWeixinSetting, senparcSetting) //注意:上一行没有 ; 下面可接着写 .RegisterXX() #region 注册公众号或小程序(按需) //注册公众号(可注册多个) -- DPBMARK MP .RegisterMpAccount(senparcWeixinSetting, "【盛派网络小助手】公众号") // DPBMARK_END //注册多个公众号或小程序(可注册多个) -- DPBMARK MiniProgram .RegisterWxOpenAccount(senparcWeixinSetting, "【盛派网络小助手】小程序") // DPBMARK_END //除此以外,仍然可以在程序任意地方注册公众号或小程序: //AccessTokenContainer.Register(appId, appSecret, name);//命名空间:Senparc.Weixin.MP.Containers #endregion #region 注册企业号(按需) -- DPBMARK Work //注册企业微信(可注册多个) .RegisterWorkAccount(senparcWeixinSetting, "【盛派网络】企业微信") //除此以外,仍然可以在程序任意地方注册企业微信: //AccessTokenContainer.Register(corpId, corpSecret, name);//命名空间:Senparc.Weixin.Work.Containers #endregion // DPBMARK_END #region 注册微信支付(按需) -- DPBMARK TenPay //注册旧微信支付版本(V2)(可注册多个) .RegisterTenpayOld(senparcWeixinSetting, "【盛派网络小助手】公众号") //这里的 name 和第一个 RegisterMpAccount() 中的一致,会被记录到同一个 SenparcWeixinSettingItem 对象中 //注册最新微信支付版本(V3)(可注册多个) .RegisterTenpayV3(senparcWeixinSetting, "【盛派网络小助手】公众号") //记录到同一个 SenparcWeixinSettingItem 对象中 #endregion // DPBMARK_END #region 注册微信第三方平台(按需) -- DPBMARK Open //注册第三方平台(可注册多个) .RegisterOpenComponent(senparcWeixinSetting, //getComponentVerifyTicketFunc async componentAppId => { var dir = Path.Combine(ServerUtility.ContentRootMapPath("~/App_Data/OpenTicket")); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } var file = Path.Combine(dir, string.Format("{0}.txt", componentAppId)); using (var fs = new FileStream(file, FileMode.Open)) { using (var sr = new StreamReader(fs)) { var ticket = await sr.ReadToEndAsync(); return(ticket); } } }, //getAuthorizerRefreshTokenFunc async(componentAppId, auhtorizerId) => { var dir = Path.Combine(ServerUtility.ContentRootMapPath("~/App_Data/AuthorizerInfo/" + componentAppId)); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } var file = Path.Combine(dir, string.Format("{0}.bin", auhtorizerId)); if (!File.Exists(file)) { return(null); } using (Stream fs = new FileStream(file, FileMode.Open)) { var binFormat = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); var result = (RefreshAuthorizerTokenResult)binFormat.Deserialize(fs); return(result.authorizer_refresh_token); } }, //authorizerTokenRefreshedFunc (componentAppId, auhtorizerId, refreshResult) => { var dir = Path.Combine(ServerUtility.ContentRootMapPath("~/App_Data/AuthorizerInfo/" + componentAppId)); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } var file = Path.Combine(dir, string.Format("{0}.bin", auhtorizerId)); using (Stream fs = new FileStream(file, FileMode.Create)) { //这里存了整个对象,实际上只存RefreshToken也可以,有了RefreshToken就能刷新到最新的AccessToken var binFormat = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); binFormat.Serialize(fs, refreshResult); fs.Flush(); } }, "【盛派网络】开放平台") //除此以外,仍然可以在程序任意地方注册开放平台: //ComponentContainer.Register();//命名空间:Senparc.Weixin.Open.Containers #endregion // DPBMARK_END ; /* 微信配置结束 */ #endregion Console.WriteLine("Hello Senparc.Weixin!"); Console.WriteLine($"Total initialization time: {(SystemTime.Now - dt1).TotalMilliseconds}ms"); Console.WriteLine($"当前缓存策略: {CacheStrategyFactory.GetObjectCacheStrategyInstance()}"); Console.ReadLine(); }
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); //设置全局 Debug 状态 var isGLobalDebug = true; //全局设置参数,将被储存到 Senparc.CO2NET.Config.SenparcSetting var senparcSetting = SenparcSetting.BuildFromWebConfig(isGLobalDebug); //也可以通过这种方法在程序任意位置设置全局 Debug 状态: //Senparc.CO2NET.Config.IsDebug = isGLobalDebug; //CO2NET 全局注册,必须!! IRegisterService register = RegisterService.Start(senparcSetting) .UseSenparcGlobal(false, () => GetExCacheStrategies(senparcSetting)); #region 全局缓存配置(按需) //当同一个分布式缓存同时服务于多个网站(应用程序池)时,可以使用命名空间将其隔离(非必须) register.ChangeDefaultCacheNamespace("CO2NETCache.net45"); #region 配置和使用 Redis //配置全局使用Redis缓存(按需,独立) var redisConfigurationStr = senparcSetting.Cache_Redis_Configuration; var useRedis = !string.IsNullOrEmpty(redisConfigurationStr) && redisConfigurationStr != "Redis配置"; if (useRedis)//这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的,这里的if条件可以忽略 { /* 说明: * 1、Redis 的连接字符串信息会从 Config.SenparcSetting.Cache_Redis_Configuration 自动获取并注册,如不需要修改,下方方法可以忽略 * /* 2、如需手动修改,可以通过下方 SetConfigurationOption 方法手动设置 Redis 链接信息(仅修改配置,不立即启用) */ Senparc.CO2NET.Cache.Redis.Register.SetConfigurationOption(redisConfigurationStr); //以下会立即将全局缓存设置为 Redis Senparc.CO2NET.Cache.Redis.Register.UseKeyValueRedisNow();//键值对缓存策略(推荐) //Senparc.CO2NET.Cache.Redis.Register.UseHashRedisNow();//HashSet储存格式的缓存策略 //也可以通过以下方式自定义当前需要启用的缓存策略 //CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisObjectCacheStrategy.Instance);//键值对 //CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisHashSetObjectCacheStrategy.Instance);//HashSet } //如果这里不进行Redis缓存启用,则目前还是默认使用内存缓存 #endregion #region 配置和使用 Memcached //配置Memcached缓存(按需,独立) var memcachedConfigurationStr = senparcSetting.Cache_Memcached_Configuration; var useMemcached = !string.IsNullOrEmpty(memcachedConfigurationStr) && memcachedConfigurationStr != "Memcached配置"; if (useMemcached) //这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的,这里的if条件可以忽略 { /* 说明: * 1、Memcached 的连接字符串信息会从 Config.SenparcSetting.Cache_Memcached_Configuration 自动获取并注册,如不需要修改,下方方法可以忽略 * /* 2、如需手动修改,可以通过下方 SetConfigurationOption 方法手动设置 Memcached 链接信息(仅修改配置,不立即启用) */ Senparc.CO2NET.Cache.Memcached.Register.SetConfigurationOption(redisConfigurationStr); //以下会立即将全局缓存设置为 Memcached Senparc.CO2NET.Cache.Memcached.Register.UseMemcachedNow(); //也可以通过以下方式自定义当前需要启用的缓存策略 CacheStrategyFactory.RegisterObjectCacheStrategy(() => MemcachedObjectCacheStrategy.Instance); } #endregion #endregion #region 注册日志(按需,建议) register.RegisterTraceLog(ConfigTraceLog);//配置TraceLog #endregion }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime appLifetime, IOptions <Dictionary <string, string> > options, IOptions <SenparcSetting> senparcSetting, IOptions <SenparcWeixinSetting> senparcWeixinSetting) { GlobalContext.HostingEnvironment = env; //GlobalContext.AutofacContainer = app.ApplicationServices.GetAutofacRoot(); AutofacUtil.Container = app.ApplicationServices.GetAutofacRoot(); //异常处理 // app.UseExceptionHandler("/Home/Error"); app.UseStatusCodePagesWithRedirects("/Login/Error/{0}"); //cookie策略 app.UseCookiePolicy(); app.UseHttpsRedirection(); //添加新的媒体文件类型,静态文件路由 app.UseAtlassDefaultFiles(options); app.UseRouting(); #region 自定义中间件 app.UseMiddleware <AtlassHttpRequestMiddleware>(); //app.UseMiddleware(typeof(AtlassExceptionMiddlerware)); #endregion app.UseAuthorization(); app.UseSession(); app.UseEasyCachingResponseCaching(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapControllerRoute(name: "areaRoute", pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"); }); //启动hangfire服务和面板 if (GlobalContext.CrontabConfigDto.Enable) { app.UseHangfireServer(new BackgroundJobServerOptions { Queues = new[] { "default" } }); // app.UseHangfireDashboard(); app.UseHangfireDashboard("/easytask", new DashboardOptions() { Authorization = new[] { new HangfireAuthorizeFilter() } }); } //关于 UseSenparcGlobal() 的更多用法见 CO2NET Demo: //https://github.com/Senparc/Senparc.CO2NET/blob/master/Sample/Senparc.CO2NET.Sample.netcore/Startup.cs IRegisterService register = RegisterService.Start(senparcSetting.Value) .UseSenparcGlobal(); register.ChangeDefaultCacheNamespace("DefaultCO2NETCache"); register.UseSenparcWeixin(senparcWeixinSetting.Value, senparcSetting.Value) #region 注册公众号(按需) //注册公众号(可注册多个) -- DPBMARK MP .RegisterMpAccount(senparcWeixinSetting.Value, "doctor_platform_mp") // DPBMARK_END //注册最新微信支付版本(V3)(可注册多个) .RegisterTenpayV3(senparcWeixinSetting.Value, "doctor_platform_tenpay"); //记录到同一个 SenparcWeixinSettingItem 对象中 #endregion //应用程序启动后 appLifetime.ApplicationStarted.Register(() => { try { GlobalParamsDto.WebRoot = env.WebRootPath; //初始化栏目相关的缓存 CmsCacheInit.Init(); } catch (Exception e) { LoggerHelper.Exception(e); } }); }
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); //DPBMARK WebSocket RegisterWebSocket();//微信注册WebSocket模块(按需,必须执行在RouteConfig.RegisterRoutes()之前) //DPBMARK_END WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); /* * CO2NET 全局注册开始 * 建议按照以下顺序进行注册 */ /* * CO2NET 是从 Senparc.Weixin 分离的底层公共基础模块,经过了长达 6 年的迭代优化。 * 关于 CO2NET 在所有项目中的通用设置可参考 CO2NET 的 Sample: * https://github.com/Senparc/Senparc.CO2NET/blob/master/Sample/Senparc.CO2NET.Sample.netcore/Startup.cs */ //设置全局 Debug 状态 var isGLobalDebug = true; //全局设置参数,将被储存到 Senparc.CO2NET.Config.SenparcSetting var senparcSetting = SenparcSetting.BuildFromWebConfig(isGLobalDebug); //也可以通过这种方法在程序任意位置设置全局 Debug 状态: //Senparc.CO2NET.Config.IsDebug = isGLobalDebug; //CO2NET 全局注册,必须!! IRegisterService register = RegisterService.Start(senparcSetting).UseSenparcGlobal(); #region 全局缓存配置(按需) //当同一个分布式缓存同时服务于多个网站(应用程序池)时,可以使用命名空间将其隔离(非必须) register.ChangeDefaultCacheNamespace("DefaultCO2NETCache"); #region 配置和使用 Redis -- DPBMARK Redis //配置全局使用Redis缓存(按需,独立) var redisConfigurationStr = senparcSetting.Cache_Redis_Configuration; var useRedis = !string.IsNullOrEmpty(redisConfigurationStr) && redisConfigurationStr != "Redis配置"; if (useRedis)//这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的,这里的if条件可以忽略 { /* 说明: * 1、Redis 的连接字符串信息会从 Config.SenparcSetting.Cache_Redis_Configuration 自动获取并注册,如不需要修改,下方方法可以忽略 * /* 2、如需手动修改,可以通过下方 SetConfigurationOption 方法手动设置 Redis 链接信息(仅修改配置,不立即启用) */ Senparc.CO2NET.Cache.Redis.Register.SetConfigurationOption(redisConfigurationStr); //以下会立即将全局缓存设置为 Redis Senparc.CO2NET.Cache.Redis.Register.UseKeyValueRedisNow();//键值对缓存策略(推荐) //Senparc.CO2NET.Cache.Redis.Register.UseHashRedisNow();//HashSet储存格式的缓存策略 //也可以通过以下方式自定义当前需要启用的缓存策略 //CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisObjectCacheStrategy.Instance);//键值对 //CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisHashSetObjectCacheStrategy.Instance);//HashSet } //如果这里不进行Redis缓存启用,则目前还是默认使用内存缓存 #endregion // DPBMARK_END #region 配置和使用 Memcached -- DPBMARK Memcached //配置Memcached缓存(按需,独立) var memcachedConfigurationStr = senparcSetting.Cache_Memcached_Configuration; var useMemcached = !string.IsNullOrEmpty(memcachedConfigurationStr) && memcachedConfigurationStr != "Memcached配置"; if (useMemcached) //这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的,这里的if条件可以忽略 { /* 说明: * 1、Memcached 的连接字符串信息会从 Config.SenparcSetting.Cache_Memcached_Configuration 自动获取并注册,如不需要修改,下方方法可以忽略 * /* 2、如需手动修改,可以通过下方 SetConfigurationOption 方法手动设置 Memcached 链接信息(仅修改配置,不立即启用) */ Senparc.CO2NET.Cache.Memcached.Register.SetConfigurationOption(memcachedConfigurationStr); //以下会立即将全局缓存设置为 Memcached Senparc.CO2NET.Cache.Memcached.Register.UseMemcachedNow(); //也可以通过以下方式自定义当前需要启用的缓存策略 CacheStrategyFactory.RegisterObjectCacheStrategy(() => MemcachedObjectCacheStrategy.Instance); } #endregion // DPBMARK_END #endregion #region 注册日志(按需,建议) register.RegisterTraceLog(ConfigWeixinTraceLog);//配置TraceLog #endregion /* 微信配置开始 * 建议按照以下顺序进行注册 */ //设置微信 Debug 状态 var isWeixinDebug = true; //全局设置参数,将被储存到 Senparc.Weixin.Config.SenparcWeixinSetting var senparcWeixinSetting = SenparcWeixinSetting.BuildFromWebConfig(isWeixinDebug); //也可以通过这种方法在程序任意位置设置微信的 Debug 状态: //Senparc.Weixin.Config.IsDebug = isWeixinDebug; //微信全局注册,必须!! register.UseSenparcWeixin(senparcWeixinSetting, senparcSetting) #region 注册公众号或小程序(按需) //注册公众号(可注册多个) -- DPBMARK MP .RegisterMpAccount(senparcWeixinSetting, "【盛派网络小助手】公众号") // DPBMARK_END //注册多个公众号或小程序(可注册多个) -- DPBMARK MiniProgram .RegisterWxOpenAccount(senparcWeixinSetting, "【盛派网络小助手】小程序") // DPBMARK_END //除此以外,仍然可以在程序任意地方注册公众号或小程序: //AccessTokenContainer.Register(appId, appSecret, name);//命名空间:Senparc.Weixin.MP.Containers #endregion #region 注册企业号(按需) -- DPBMARK Work //注册企业微信(可注册多个) .RegisterWorkAccount(senparcWeixinSetting, "【盛派网络】企业微信") //除此以外,仍然可以在程序任意地方注册企业微信: //AccessTokenContainer.Register(corpId, corpSecret, name);//命名空间:Senparc.Weixin.Work.Containers #endregion // DPBMARK_END #region 注册微信支付(按需) -- DPBMARK TenPay //注册旧微信支付版本(V2)(可注册多个) .RegisterTenpayOld(senparcWeixinSetting, "【盛派网络小助手】公众号") //这里的 name 和第一个 RegisterMpAccount() 中的一致,会被记录到同一个 SenparcWeixinSettingItem 对象中 //注册最新微信支付版本(V3)(可注册多个) .RegisterTenpayV3(senparcWeixinSetting, "【盛派网络小助手】公众号") //记录到同一个 SenparcWeixinSettingItem 对象中 #endregion // DPBMARK_END #region 注册微信第三方平台(按需) -- DPBMARK Open //注册第三方平台(可注册多个) .RegisterOpenComponent(senparcWeixinSetting, //getComponentVerifyTicketFunc async componentAppId => { var dir = Path.Combine(ServerUtility.ContentRootMapPath("~/App_Data/OpenTicket")); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } var file = Path.Combine(dir, string.Format("{0}.txt", componentAppId)); using (var fs = new FileStream(file, FileMode.Open)) { using (var sr = new StreamReader(fs)) { var ticket = await sr.ReadToEndAsync(); return(ticket); } } }, //getAuthorizerRefreshTokenFunc async(componentAppId, auhtorizerId) => { var dir = Path.Combine(ServerUtility.ContentRootMapPath("~/App_Data/AuthorizerInfo/" + componentAppId)); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } var file = Path.Combine(dir, string.Format("{0}.bin", auhtorizerId)); if (!File.Exists(file)) { return(null); } using (Stream fs = new FileStream(file, FileMode.Open)) { var binFormat = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); var result = (RefreshAuthorizerTokenResult)binFormat.Deserialize(fs); return(result.authorizer_refresh_token); } }, //authorizerTokenRefreshedFunc async(componentAppId, auhtorizerId, refreshResult) => { var dir = Path.Combine(ServerUtility.ContentRootMapPath("~/App_Data/AuthorizerInfo/" + componentAppId)); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } var file = Path.Combine(dir, string.Format("{0}.bin", auhtorizerId)); using (Stream fs = new FileStream(file, FileMode.Create)) { //这里存了整个对象,实际上只存RefreshToken也可以,有了RefreshToken就能刷新到最新的AccessToken var binFormat = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); binFormat.Serialize(fs, refreshResult); fs.Flush(); } }, "【盛派网络】开放平台") //除此以外,仍然可以在程序任意地方注册开放平台: //ComponentContainer.Register();//命名空间:Senparc.Weixin.Open.Containers #endregion // DPBMARK_END ; /* 微信配置结束 */ }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, IOptions <SenparcSetting> senparcSetting) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseCookiePolicy(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); // 启动 CO2NET 全局注册,必须! IRegisterService register = RegisterService.Start(env, senparcSetting.Value) .UseSenparcGlobal(false, () => GetExCacheStrategies(senparcSetting.Value)); //如果需要自动扫描自定义扩展缓存,可以这样使用: //register.UseSenparcWeixin(true); //如果需要指定自定义扩展缓存,可以这样用: //register.UseSenparcWeixin(false, GetExCacheStrategies); #region CO2NET 全局配置 #region 注册线程,在 RegisterService.Start() 中已经自动注册,此处也可以省略,仅作演示 register.RegisterThreads(); //启动线程,RegisterThreads()也可以省略,在RegisterService.Start()中已经自动注册 #endregion #region 缓存配置(按需) //当同一个分布式缓存同时服务于多个网站(应用程序池)时,可以使用命名空间将其隔离(非必须) register.ChangeDefaultCacheNamespace("CO2NETCache.netcore"); //配置全局使用Redis缓存(按需,独立) var redisConfigurationStr = senparcSetting.Value.Cache_Redis_Configuration; var useRedis = !string.IsNullOrEmpty(redisConfigurationStr) && redisConfigurationStr != "Redis配置"; if (useRedis)//这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的 { //设置Redis链接信息,并在全局立即启用Redis缓存。 register.RegisterCacheRedis(redisConfigurationStr, redisConfiguration => RedisObjectCacheStrategy.Instance); //此外还可以通过这种方式修改 Redis 链接信息(不立即启用): //RedisManager.ConfigurationOption = redisConfigurationStr; //以下会立即将全局缓存设置为Redis(不修改配置)。 //如果要使用其他缓存,同样可以在任意地方使用这个方法,修改 RedisObjectCacheStrategy 为其他缓存策略 //CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisObjectCacheStrategy.Instance); } //如果这里不进行Redis缓存启用,则目前还是默认使用内存缓存 //配置Memcached缓存(按需,独立) //这里配置的是 CO2NET 的 Memcached 缓存(如果执行了下面的 app.UseSenparcWeixinCacheMemcached(), //会自动包含本步骤,这一步注册可以忽略) var useMemcached = false; app.UseWhen(h => useMemcached, a => { a.UseEnyimMemcached(); //确保Memcached连接可用后,启用下面的做法: //var memcachedConnStr = senparcSetting.Value.Cache_Memcached_Configuration; //var memcachedConnDic = new Dictionary<string, int>() {/*进行配置 { "localhost", 9101 }*/ };//可以由 memcachedConnStr 分割得到,或直接填写 //register.RegisterCacheMemcached(memcachedConnDic, memcachedConfig => MemcachedObjectCacheStrategy.Instance); }); #endregion #region 注册日志(按需,建议) register.RegisterTraceLog(ConfigTraceLog);//配置TraceLog #endregion #endregion }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, IOptions <SenparcSetting> senparcSetting, IOptions <SenparcWeixinSetting> senparcWeixinSetting) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseCookiePolicy(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); // 启动 CO2NET 全局注册,必须! IRegisterService register = RegisterService.Start(env, senparcSetting.Value).UseSenparcGlobal(); #region CO2NET 全局配置 #region 全局缓存配置(按需) //当同一个分布式缓存同时服务于多个网站(应用程序池)时,可以使用命名空间将其隔离(非必须) register.ChangeDefaultCacheNamespace("2018TechSummitCache"); #region 配置和使用 Redis //配置全局使用Redis缓存(按需,独立) var redisConfigurationStr = senparcSetting.Value.Cache_Redis_Configuration; Senparc.CO2NET.Cache.Redis.Register.SetConfigurationOption(redisConfigurationStr); Senparc.CO2NET.Cache.Redis.Register.UseKeyValueRedisNow();//键值对缓存策略(推荐) #endregion #endregion #endregion #region 微信相关配置 //微信的 Redis 缓存,如果不使用则注释掉(开启前必须保证配置有效,否则会抛错) app.UseSenparcWeixinCacheRedis(); //开始注册微信信息,必须! register.UseSenparcWeixin(senparcWeixinSetting.Value, senparcSetting.Value) #region 注册公众号或小程序(按需) //注册公众号(可注册多个) .RegisterMpAccount(senparcWeixinSetting.Value, "【盛派网络小助手】公众号") //注册多个公众号或小程序(可注册多个) .RegisterWxOpenAccount(senparcWeixinSetting.Value, "【盛派网络小助手】小程序"); #endregion #endregion }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, IOptions <SenparcSetting> senparcSetting) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseCookiePolicy(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); // 启动 CO2NET 全局注册,必须! IRegisterService register = RegisterService.Start(env, senparcSetting.Value) .UseSenparcGlobal(false, () => GetExCacheStrategies(senparcSetting.Value)); //如果需要自动扫描自定义扩展缓存,可以这样使用: //register.UseSenparcGlobal(true); //如果需要指定自定义扩展缓存,可以这样用: //register.UseSenparcGlobal(false, GetExCacheStrategies(senparcSetting.Value)); #region CO2NET 全局配置 #region 全局缓存配置(按需) //当同一个分布式缓存同时服务于多个网站(应用程序池)时,可以使用命名空间将其隔离(非必须) register.ChangeDefaultCacheNamespace("CO2NETCache.netcore"); #region 配置和使用 Redis //配置全局使用Redis缓存(按需,独立) var redisConfigurationStr = senparcSetting.Value.Cache_Redis_Configuration; var useRedis = !string.IsNullOrEmpty(redisConfigurationStr) && redisConfigurationStr != "Redis配置"; if (useRedis)//这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的,这里的if条件可以忽略 { /* 说明: * 1、Redis 的连接字符串信息会从 Config.SenparcSetting.Cache_Redis_Configuration 自动获取并注册,如不需要修改,下方方法可以忽略 * /* 2、如需手动修改,可以通过下方 SetConfigurationOption 方法手动设置 Redis 链接信息(仅修改配置,不立即启用) */ Senparc.CO2NET.Cache.Redis.Register.SetConfigurationOption(redisConfigurationStr); //以下会立即将全局缓存设置为 Redis Senparc.CO2NET.Cache.Redis.Register.UseKeyValueRedisNow();//键值对缓存策略(推荐) //Senparc.CO2NET.Cache.Redis.Register.UseHashRedisNow();//HashSet储存格式的缓存策略 //也可以通过以下方式自定义当前需要启用的缓存策略 //CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisObjectCacheStrategy.Instance);//键值对 //CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisHashSetObjectCacheStrategy.Instance);//HashSet } //如果这里不进行Redis缓存启用,则目前还是默认使用内存缓存 #endregion #region 配置和使用 Memcached //配置Memcached缓存(按需,独立) var memcachedConfigurationStr = senparcSetting.Value.Cache_Memcached_Configuration; var useMemcached = !string.IsNullOrEmpty(memcachedConfigurationStr) && memcachedConfigurationStr != "Memcached配置"; if (useMemcached) //这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的,这里的if条件可以忽略 { app.UseEnyimMemcached(); /* 说明: * 1、Memcached 的连接字符串信息会从 Config.SenparcSetting.Cache_Memcached_Configuration 自动获取并注册,如不需要修改,下方方法可以忽略 * /* 2、如需手动修改,可以通过下方 SetConfigurationOption 方法手动设置 Memcached 链接信息(仅修改配置,不立即启用) */ Senparc.CO2NET.Cache.Memcached.Register.SetConfigurationOption(redisConfigurationStr); //以下会立即将全局缓存设置为 Memcached Senparc.CO2NET.Cache.Memcached.Register.UseMemcachedNow(); //也可以通过以下方式自定义当前需要启用的缓存策略 CacheStrategyFactory.RegisterObjectCacheStrategy(() => MemcachedObjectCacheStrategy.Instance); } #endregion #endregion #region 注册日志(按需,建议) register.RegisterTraceLog(ConfigTraceLog);//配置TraceLog #endregion #endregion }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, IOptions <SenparcSetting> senparcSetting, IOptions <SenparcWeixinSetting> senparcWeixinSetting) { //引入EnableRequestRewind中间件 app.UseEnableRequestRewind(); app.UseSession(); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseBrowserLink(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); // 启动 CO2NET 全局注册,必须! IRegisterService register = RegisterService.Start(env, senparcSetting.Value) //关于 UseSenparcGlobal() 的更多用法见 CO2NET Demo:https://github.com/Senparc/Senparc.CO2NET/blob/master/Sample/Senparc.CO2NET.Sample.netcore/Startup.cs .UseSenparcGlobal(); //如果需要自动扫描自定义扩展缓存,可以这样使用: //register.UseSenparcGlobal(true); //如果需要指定自定义扩展缓存,可以这样用: //register.UseSenparcGlobal(false, GetExCacheStrategies); #region CO2NET 全局配置 #region 全局缓存配置(按需) //当同一个分布式缓存同时服务于多个网站(应用程序池)时,可以使用命名空间将其隔离(非必须) register.ChangeDefaultCacheNamespace("DefaultCO2NETCache"); #region 配置和使用 Redis -- DPBMARK Redis //配置全局使用Redis缓存(按需,独立) var redisConfigurationStr = senparcSetting.Value.Cache_Redis_Configuration; var useRedis = !string.IsNullOrEmpty(redisConfigurationStr) && redisConfigurationStr != "#{Cache_Redis_Configuration}#" /*默认值,不启用*/; if (useRedis)//这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的,这里的if条件可以忽略 { /* 说明: * 1、Redis 的连接字符串信息会从 Config.SenparcSetting.Cache_Redis_Configuration 自动获取并注册,如不需要修改,下方方法可以忽略 * /* 2、如需手动修改,可以通过下方 SetConfigurationOption 方法手动设置 Redis 链接信息(仅修改配置,不立即启用) */ Senparc.CO2NET.Cache.Redis.Register.SetConfigurationOption(redisConfigurationStr); //以下会立即将全局缓存设置为 Redis Senparc.CO2NET.Cache.Redis.Register.UseKeyValueRedisNow();//键值对缓存策略(推荐) //Senparc.CO2NET.Cache.Redis.Register.UseHashRedisNow();//HashSet储存格式的缓存策略 //也可以通过以下方式自定义当前需要启用的缓存策略 //CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisObjectCacheStrategy.Instance);//键值对 //CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisHashSetObjectCacheStrategy.Instance);//HashSet } //如果这里不进行Redis缓存启用,则目前还是默认使用内存缓存 #endregion // DPBMARK_END #region 配置和使用 Memcached -- DPBMARK Memcached //配置Memcached缓存(按需,独立) var memcachedConfigurationStr = senparcSetting.Value.Cache_Memcached_Configuration; var useMemcached = !string.IsNullOrEmpty(memcachedConfigurationStr) && memcachedConfigurationStr != "#{Cache_Memcached_Configuration}#"; if (useMemcached) //这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的,这里的if条件可以忽略 { app.UseEnyimMemcached(); /* 说明: * 1、Memcached 的连接字符串信息会从 Config.SenparcSetting.Cache_Memcached_Configuration 自动获取并注册,如不需要修改,下方方法可以忽略 * /* 2、如需手动修改,可以通过下方 SetConfigurationOption 方法手动设置 Memcached 链接信息(仅修改配置,不立即启用) */ Senparc.CO2NET.Cache.Memcached.Register.SetConfigurationOption(memcachedConfigurationStr); //以下会立即将全局缓存设置为 Memcached Senparc.CO2NET.Cache.Memcached.Register.UseMemcachedNow(); //也可以通过以下方式自定义当前需要启用的缓存策略 CacheStrategyFactory.RegisterObjectCacheStrategy(() => MemcachedObjectCacheStrategy.Instance); } #endregion // DPBMARK_END #endregion #region 注册日志(按需,建议) register.RegisterTraceLog(ConfigTraceLog);//配置TraceLog #endregion CO2NET.APM.Config.DataExpire = TimeSpan.FromMinutes(60);//测试APM缓存过期时间(默认情况下可以不用设置) #endregion #region 微信相关配置 /* 微信配置开始 * * 建议按照以下顺序进行注册,尤其须将缓存放在第一位! */ //注册开始 #region 微信缓存(按需,必须在 register.UseSenparcWeixin() 之前) //微信的 Redis 缓存,如果不使用则注释掉(开启前必须保证配置有效,否则会抛错) -- DPBMARK Redis if (useRedis) { app.UseSenparcWeixinCacheRedis(); } // DPBMARK_END // 微信的 Memcached 缓存,如果不使用则注释掉(开启前必须保证配置有效,否则会抛错) -- DPBMARK Memcached if (useMemcached) { app.UseSenparcWeixinCacheMemcached(); } // DPBMARK_END #endregion //开始注册微信信息,必须! register.UseSenparcWeixin(senparcWeixinSetting.Value, senparcSetting.Value) //注意:上一行没有 ; 下面可接着写 .RegisterXX() #region 注册公众号或小程序(按需) //注册公众号(可注册多个) -- DPBMARK MP .RegisterMpAccount(senparcWeixinSetting.Value, "【盛派网络小助手】公众号") // DPBMARK_END //除此以外,仍然可以在程序任意地方注册公众号或小程序: //AccessTokenContainer.Register(appId, appSecret, name);//命名空间:Senparc.Weixin.MP.Containers #endregion ; /* 微信配置结束 */ #endregion }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, IOptions <SenparcSetting> senparcSetting, IOptions <SenparcWeixinSetting> senparcWeixinSetting, IHubContext <ReloadPageHub> hubContext) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseStaticFiles(new StaticFileOptions() { FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"node_modules")), RequestPath = new PathString("/node_modules") }); app.UseCookiePolicy(); app.UseMvc(); #region CO2NET // 启动 CO2NET 全局注册,必须! IRegisterService register = RegisterService.Start(env, senparcSetting.Value) //关于 UseSenparcGlobal() 的更多用法见 CO2NET Demo:https://github.com/Senparc/Senparc.CO2NET/blob/master/Sample/Senparc.CO2NET.Sample.netcore/Startup.cs .UseSenparcGlobal(); #region 全局缓存配置(按需) //当同一个分布式缓存同时服务于多个网站(应用程序池)时,可以使用命名空间将其隔离(非必须) register.ChangeDefaultCacheNamespace("SCFCache"); #region 配置和使用 Redis //配置全局使用Redis缓存(按需,独立) var redisConfigurationStr = senparcSetting.Value.Cache_Redis_Configuration; var useRedis = !string.IsNullOrEmpty(redisConfigurationStr) && redisConfigurationStr != "Redis配置"; if (useRedis) //这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的,这里的if条件可以忽略 { /* 说明: * 1、Redis 的连接字符串信息会从 Config.SenparcSetting.Cache_Redis_Configuration 自动获取并注册,如不需要修改,下方方法可以忽略 * /* 2、如需手动修改,可以通过下方 SetConfigurationOption 方法手动设置 Redis 链接信息(仅修改配置,不立即启用) */ Senparc.CO2NET.Cache.Redis.Register.SetConfigurationOption(redisConfigurationStr); //以下会立即将全局缓存设置为 Redis Senparc.CO2NET.Cache.Redis.Register.UseKeyValueRedisNow(); //键值对缓存策略(推荐) //Senparc.CO2NET.Cache.Redis.Register.UseHashRedisNow();//HashSet储存格式的缓存策略 //也可以通过以下方式自定义当前需要启用的缓存策略 //CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisObjectCacheStrategy.Instance);//键值对 //CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisHashSetObjectCacheStrategy.Instance);//HashSet } //如果这里不进行Redis缓存启用,则目前还是默认使用内存缓存 #endregion #region 注册日志(按需,建议) register.RegisterTraceLog(ConfigTraceLog); //配置TraceLog #endregion #endregion #endregion #region Weixin 设置 /* 微信配置开始 * * 建议按照以下顺序进行注册,尤其须将缓存放在第一位! */ //注册开始 #region 微信缓存(按需,必须在 register.UseSenparcWeixin () 之前) //微信的 Redis 缓存,如果不使用则注释掉(开启前必须保证配置有效,否则会抛错) if (useRedis) { app.UseSenparcWeixinCacheRedis(); } #endregion //开始注册微信信息,必须! register.UseSenparcWeixin(senparcWeixinSetting.Value, senparcSetting.Value) //注意:上一行没有 ; 下面可接着写 .RegisterXX() #region 注册公众号或小程序(按需) //注册公众号(可注册多个) .RegisterMpAccount(senparcWeixinSetting.Value, "SCF") .RegisterMpAccount("", "", "Senparc_Template") //注册多个公众号或小程序(可注册多个) //.RegisterWxOpenAccount(senparcWeixinSetting.Value, "【盛派网络小助手】小程序") //注册第三方平台(可注册多个) #region 注册第三方平台 .RegisterOpenComponent(senparcWeixinSetting.Value, //getComponentVerifyTicketFunc async componentAppId => { var dir = Path.Combine(ServerUtility.ContentRootMapPath("~/App_Data/OpenTicket")); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } var file = Path.Combine(dir, string.Format("{0}.txt", componentAppId)); using (var fs = new FileStream(file, FileMode.Open)) { using (var sr = new StreamReader(fs)) { var ticket = await sr.ReadToEndAsync(); return(ticket); } } }, //getAuthorizerRefreshTokenFunc async(componentAppId, auhtorizerId) => { var dir = Path.Combine(ServerUtility.ContentRootMapPath("~/App_Data/AuthorizerInfo/" + componentAppId)); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } var file = Path.Combine(dir, string.Format("{0}.bin", auhtorizerId)); if (!System.IO.File.Exists(file)) { return(null); } using (Stream fs = new FileStream(file, FileMode.Open)) { var binFormat = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); var result = (RefreshAuthorizerTokenResult)binFormat.Deserialize(fs); return(result.authorizer_refresh_token); } }, //authorizerTokenRefreshedFunc (componentAppId, auhtorizerId, refreshResult) => { var dir = Path.Combine(ServerUtility.ContentRootMapPath("~/App_Data/AuthorizerInfo/" + componentAppId)); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } var file = Path.Combine(dir, string.Format("{0}.bin", auhtorizerId)); using (Stream fs = new FileStream(file, FileMode.Create)) { var binFormat = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); binFormat.Serialize(fs, refreshResult); fs.Flush(); } }, "【盛派网络】开放平台") #endregion //除此以外,仍然可以在程序任意地方注册公众号或小程序: //AccessTokenContainer.Register(appId, appSecret, name);//命名空间:Senparc.Weixin.MP.Containers #endregion #region 注册微信支付(按需) //注册最新微信支付版本(V3)(可注册多个) .RegisterTenpayV3(senparcWeixinSetting.Value, "SCF") //记录到同一个 SenparcWeixinSettingItem 对象中 #endregion ; #endregion #region .NET Core默认不支持GB2312 //http://www.mamicode.com/info-detail-2225481.html Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); #endregion #region Senparc.Core 设置 //用于解决HttpContext.Connection.RemoteIpAddress为null的问题 //https://stackoverflow.com/questions/35441521/remoteipaddress-is-always-null app.UseHttpMethodOverride(new HttpMethodOverrideOptions { //FormFieldName = "X-Http-Method-Override"//此为默认值 }); app.UseSenparcMvcDI(); //Senparc.Scf.Core.Config.SiteConfig.SenparcCoreSetting = senparcCoreSetting.Value;//网站设置 //提供网站根目录 if (env.ContentRootPath != null) { Senparc.Scf.Core.Config.SiteConfig.ApplicationPath = env.ContentRootPath; Senparc.Scf.Core.Config.SiteConfig.WebRootPath = env.WebRootPath; } #endregion #region 异步线程 { ////APM Ending 数据统计 //var utility = new APMNeuralDataThreadUtility(); //Thread thread = new Thread(utility.Run) { Name = "APMNeuralDataThread" }; //SiteConfig.AsynThread.Add(thread.Name, thread); } SiteConfig.AsynThread.Values.ToList().ForEach(z => { z.IsBackground = true; z.Start(); }); //全部运行 #endregion }
/// <summary> /// Senparc微信开发相关配置 /// </summary> private void WechatConfigure(IApplicationBuilder app, IHostingEnvironment env, IOptions <SenparcSetting> senparcSetting, IOptions <SenparcWeixinSetting> senparcWeixinSetting) { // 启动 CO2NET 全局注册,必须! IRegisterService register = RegisterService.Start(env, senparcSetting.Value) //关于 UseSenparcGlobal() 的更多用法见 CO2NET Demo:https://github.com/Senparc/Senparc.CO2NET/blob/master/Sample/Senparc.CO2NET.Sample.netcore/Startup.cs .UseSenparcGlobal(); //如果需要自动扫描自定义扩展缓存,可以这样使用: //register.UseSenparcGlobal(true); //如果需要指定自定义扩展缓存,可以这样用: //register.UseSenparcGlobal(false, GetExCacheStrategies); #region CO2NET 全局配置 #region 全局缓存配置(按需) //当同一个分布式缓存同时服务于多个网站(应用程序池)时,可以使用命名空间将其隔离(非必须) register.ChangeDefaultCacheNamespace("DefaultCO2NETCache"); #region 配置和使用 Redis -- DPBMARK Redis /* * //配置全局使用Redis缓存(按需,独立) * var redisConfigurationStr = senparcSetting.Value.Cache_Redis_Configuration; * var useRedis = !string.IsNullOrEmpty(redisConfigurationStr) && redisConfigurationStr != "Redis配置"; * if (useRedis)//这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的,这里的if条件可以忽略 * { * // 说明: * // 1、Redis 的连接字符串信息会从 Config.SenparcSetting.Cache_Redis_Configuration 自动获取并注册,如不需要修改,下方方法可以忽略 * // 2、如需手动修改,可以通过下方 SetConfigurationOption 方法手动设置 Redis 链接信息(仅修改配置,不立即启用) * * Senparc.CO2NET.Cache.Redis.Register.SetConfigurationOption(redisConfigurationStr); * * //以下会立即将全局缓存设置为 Redis * Senparc.CO2NET.Cache.Redis.Register.UseKeyValueRedisNow();//键值对缓存策略(推荐) * //Senparc.CO2NET.Cache.Redis.Register.UseHashRedisNow();//HashSet储存格式的缓存策略 * * //也可以通过以下方式自定义当前需要启用的缓存策略 * //CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisObjectCacheStrategy.Instance);//键值对 * //CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisHashSetObjectCacheStrategy.Instance);//HashSet * } * //如果这里不进行Redis缓存启用,则目前还是默认使用内存缓存 */ #endregion // DPBMARK_END #region 配置和使用 Memcached -- DPBMARK Memcached /* * //配置Memcached缓存(按需,独立) * var memcachedConfigurationStr = senparcSetting.Value.Cache_Memcached_Configuration; * var useMemcached = !string.IsNullOrEmpty(memcachedConfigurationStr) && memcachedConfigurationStr != "Memcached配置"; * * if (useMemcached) //这里为了方便不同环境的开发者进行配置,做成了判断的方式,实际开发环境一般是确定的,这里的if条件可以忽略 * { * app.UseEnyimMemcached(); * * // 说明: * // 1、Memcached 的连接字符串信息会从 Config.SenparcSetting.Cache_Memcached_Configuration 自动获取并注册,如不需要修改,下方方法可以忽略 * // 2、如需手动修改,可以通过下方 SetConfigurationOption 方法手动设置 Memcached 链接信息(仅修改配置,不立即启用) * * Senparc.CO2NET.Cache.Memcached.Register.SetConfigurationOption(memcachedConfigurationStr); * * //以下会立即将全局缓存设置为 Memcached * Senparc.CO2NET.Cache.Memcached.Register.UseMemcachedNow(); * * //也可以通过以下方式自定义当前需要启用的缓存策略 * CacheStrategyFactory.RegisterObjectCacheStrategy(() => MemcachedObjectCacheStrategy.Instance); * } */ #endregion // DPBMARK_END #endregion #region 注册日志(按需,建议) register.RegisterTraceLog(ConfigTraceLog);//配置TraceLog #endregion #endregion #region 微信相关配置 /* 微信配置开始 * * 建议按照以下顺序进行注册,尤其须将缓存放在第一位! */ //注册开始 #region 微信缓存(按需,必须在 register.UseSenparcWeixin() 之前) //微信的 Redis 缓存,如果不使用则注释掉(开启前必须保证配置有效,否则会抛错) -- DPBMARK Redis /*if (useRedis) * { * app.UseSenparcWeixinCacheRedis(); * } // DPBMARK_END * * * // 微信的 Memcached 缓存,如果不使用则注释掉(开启前必须保证配置有效,否则会抛错) -- DPBMARK Memcached * if (useMemcached) * { * app.UseSenparcWeixinCacheMemcached(); * } // DPBMARK_END */ #endregion //开始注册微信信息,必须! register.UseSenparcWeixin(senparcWeixinSetting.Value, senparcSetting.Value) //注意:上一行没有 ; 下面可接着写 .RegisterXX() #region 注册公众号或小程序(按需) //注册公众号(可注册多个) -- DPBMARK MP .RegisterMpAccount(senparcWeixinSetting.Value, "公众号") // DPBMARK_END //注册多个公众号或小程序(可注册多个) -- DPBMARK MiniProgram .RegisterWxOpenAccount(senparcWeixinSetting.Value, "小程序") // DPBMARK_END //除此以外,仍然可以在程序任意地方注册公众号或小程序: //AccessTokenContainer.Register(appId, appSecret, name);//命名空间:Senparc.Weixin.MP.Containers #endregion #region 注册企业号(按需) -- DPBMARK Work //注册企业微信(可注册多个) //.RegisterWorkAccount(senparcWeixinSetting.Value, "【盛派网络】企业微信") //除此以外,仍然可以在程序任意地方注册企业微信: //AccessTokenContainer.Register(corpId, corpSecret, name);//命名空间:Senparc.Weixin.Work.Containers #endregion // DPBMARK_END #region 注册微信支付(按需) -- DPBMARK TenPay //注册旧微信支付版本(V2)(可注册多个) //.RegisterTenpayOld(senparcWeixinSetting.Value, "【盛派网络小助手】公众号")//这里的 name 和第一个 RegisterMpAccount() 中的一致,会被记录到同一个 SenparcWeixinSettingItem 对象中 //注册最新微信支付版本(V3)(可注册多个) // .RegisterTenpayV3(senparcWeixinSetting.Value, "【盛派网络小助手】公众号")//记录到同一个 SenparcWeixinSettingItem 对象中 #endregion // DPBMARK_END #region 注册微信第三方平台(按需) -- DPBMARK Open //注册第三方平台(可注册多个) //.RegisterOpenComponent(senparcWeixinSetting.Value, //getComponentVerifyTicketFunc //componentAppId => //{ // var dir = Path.Combine(Server.GetMapPath("~/App_Data/OpenTicket")); // if (!Directory.Exists(dir)) // { // Directory.CreateDirectory(dir); // } // var file = Path.Combine(dir, string.Format("{0}.txt", componentAppId)); // using (var fs = new FileStream(file, FileMode.Open)) // { // using (var sr = new StreamReader(fs)) // { // var ticket = sr.ReadToEnd(); // return ticket; // } // } //}, //getAuthorizerRefreshTokenFunc //(componentAppId, auhtorizerId) => //{ // var dir = Path.Combine(Server.GetMapPath("~/App_Data/AuthorizerInfo/" + componentAppId)); // if (!Directory.Exists(dir)) // { // Directory.CreateDirectory(dir); // } // var file = Path.Combine(dir, string.Format("{0}.bin", auhtorizerId)); // if (!File.Exists(file)) // { // return null; // } // using (Stream fs = new FileStream(file, FileMode.Open)) // { // var binFormat = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); // var result = (RefreshAuthorizerTokenResult)binFormat.Deserialize(fs); // return result.authorizer_refresh_token; // } //}, //authorizerTokenRefreshedFunc //(componentAppId, auhtorizerId, refreshResult) => //{ // var dir = Path.Combine(Server.GetMapPath("~/App_Data/AuthorizerInfo/" + componentAppId)); // if (!Directory.Exists(dir)) // { // Directory.CreateDirectory(dir); // } // var file = Path.Combine(dir, string.Format("{0}.bin", auhtorizerId)); // using (Stream fs = new FileStream(file, FileMode.Create)) // { // //这里存了整个对象,实际上只存RefreshToken也可以,有了RefreshToken就能刷新到最新的AccessToken // var binFormat = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); // binFormat.Serialize(fs, refreshResult); // fs.Flush(); // } //}, "达州烟草 开放平台") //除此以外,仍然可以在程序任意地方注册开放平台: //ComponentContainer.Register();//命名空间:Senparc.Weixin.Open.Containers #endregion // DPBMARK_END ; /* 微信配置结束 */ #endregion }