};//Admin比较特殊,不需要全部输出 public IMvcBuilder AuthorizeConfig(IMvcBuilder builder, IWebHostEnvironment env) { //鉴权配置 //添加基于Cookie的权限验证:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/cookie?view=aspnetcore-2.1&tabs=aspnetcore2x builder.Services .AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(AdminAuthorizeAttribute.AuthenticationScheme, options => { options.AccessDeniedPath = "/Admin/Forbidden/"; options.LoginPath = "/Admin/Login/"; options.Cookie.HttpOnly = false; }); builder.Services .AddAuthorization(options => { options.AddPolicy("AdminOnly", policy => { policy.RequireClaim("AdminMember"); }); }); builder.AddRazorPagesOptions(options => { options.Conventions.AuthorizePage("/", "AdminOnly"); //必须登录 options.Conventions.AllowAnonymousToPage("/Login"); //允许匿名 //更多:https://docs.microsoft.com/en-us/aspnet/core/security/authorization/razor-pages-authorization?view=aspnetcore-2.2 }); SenparcTrace.SendCustomLog("系统启动", "完成 Area:Admin 注册"); return(builder); }
public IActionResult BaseCallback(string code, string state, string returnUrl) { try { if (string.IsNullOrEmpty(code)) { return(Content("您拒绝了授权!")); } if (state != HttpContext.Session.GetString("State")) { //这里的state其实是会暴露给客户端的,验证能力很弱,这里只是演示一下, //建议用完之后就清空,将其一次性使用 //实际上可以存任何想传递的数据,比如用户ID,并且需要结合例如下面的Session["OAuthAccessToken"]进行验证 return(Content("验证失败!请从正规途径进入!")); } //通过,用code换取access_token var result = OAuthApi.GetAccessToken(appId, appSecret, code); if (result.errcode != Senparc.Weixin.ReturnCode.请求成功) { return(Content("错误:" + result.errmsg)); } //下面2个数据也可以自己封装成一个类,储存在数据库中(建议结合缓存) //如果可以确保安全,可以将access_token存入用户的cookie中,每一个人的access_token是不一样的 HttpContext.Session.SetString("OAuthAccessTokenStartTime", SystemTime.Now.ToString()); HttpContext.Session.SetString("OAuthAccessToken", result.ToJson()); //因为这里还不确定用户是否关注本微信,所以只能试探性地获取一下 OAuthUserInfo userInfo = null; try { //已关注,可以得到详细信息 userInfo = OAuthApi.GetUserInfo(result.access_token, result.openid); if (!string.IsNullOrEmpty(returnUrl)) { return(Redirect(returnUrl)); } ViewData["ByBase"] = true; return(View("UserInfoCallback", userInfo)); } catch (ErrorJsonResultException ex) { SenparcTrace.SendCustomLog("获取用户讯息失败", ex.ToString()); //未关注,只能授权,无法得到详细信息 //这里的 ex.JsonResult 可能为:"{\"errcode\":40003,\"errmsg\":\"invalid openid\"}" return(Content("用户已授权,授权Token:" + result, "text/html", Encoding.UTF8)); } } catch (Exception ex) { SenparcTrace.SendCustomLog("BaseCallback 发生错误", ex.ToString()); return(Content("发生错误:" + ex.ToString())); } }
/// <summary> /// 自动扫描并注册 ApiBind /// </summary> public static void RegisterApiBind() { DateTime dt1 = SystemTime.Now; var cacheStragegy = CacheStrategyFactory.GetObjectCacheStrategyInstance(); using (cacheStragegy.BeginCacheLock("Senparc.NeuChar.Register", "RegisterApiBind")) { if (RegisterApiBindFinished == true) { return; } //查找所有扩展缓存 var scanTypesCount = 0; var assembiles = AppDomain.CurrentDomain.GetAssemblies(); foreach (var assembly in assembiles) { try { scanTypesCount++; var classTypes = assembly.GetTypes() .Where(z => z.Name.EndsWith("api", StringComparison.OrdinalIgnoreCase) || z.Name.EndsWith("apis", StringComparison.OrdinalIgnoreCase)) .ToArray(); foreach (var type in classTypes) { if (/*type.IsAbstract || 静态类会被识别为 IsAbstract*/ !type.IsPublic || !type.IsClass || type.IsEnum) { continue; } var methods = type.GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.InvokeMethod); foreach (var method in methods) { var attrs = method.GetCustomAttributes(typeof(ApiBindAttribute), false); foreach (var attr in attrs) { ApiBindInfoCollection.Instance.Add(method, attr as ApiBindAttribute); } } } } catch (Exception ex) { SenparcTrace.SendCustomLog("RegisterApiBind() 自动扫描程序集报告(非程序异常):" + assembly.FullName, ex.ToString()); } } RegisterApiBindFinished = true; DateTime dt2 = SystemTime.Now; Console.WriteLine($"RegisterApiBind 用时:{(dt2 - dt1).TotalMilliseconds}ms"); } }
/// <summary> /// 发送文本客服消息 /// </summary> /// <param name="accessTokenOrAppId"></param> /// <param name="openId"></param> /// <param name="content"></param> /// <returns></returns> public override async Task <ApiResult> SendText(string accessTokenOrAppId, string openId, string content) { SenparcTrace.SendCustomLog("wxTest-sendText", "openID:" + openId + " || appID:" + accessTokenOrAppId + "|| content:" + content); var result = await AdvancedAPIs.CustomApi.SendTextAsync(accessTokenOrAppId, openId, content); return(new ApiResult((int)result.errcode, result.errmsg, result)); }
public APMException(string message, string domain, string kindName, string method, Exception inner = null) : base(message, inner, true) { SenparcTrace.SendCustomLog("APM 执行出错", $@"Domain: {domain} KindName: {kindName} Message: {message} Exception: {inner?.ToString()}"); }
public MainWindow() { InitializeComponent(); SenparcTrace.SendCustomLog("System", "Window opened."); txtPath.Text = Environment.CurrentDirectory; Init(); }
public void SendApiPostDataLogTest() { var url = "http://www.senparc.com"; var data = Guid.NewGuid().ToString();//随机字符串 SenparcTrace.SendApiLog(url, data); Assert.IsTrue(UnitTestHelper.CheckKeywordsExist(LogFilePath, url, data)); }
public void LogTest() { //直接调用此方法不会记录到log文件中,而是输出到系统日志中 var keyword = Guid.NewGuid().ToString();//随机字符串 SenparcTrace.Log($"添加Log:{keyword}"); //Assert.IsTrue(UnitTestHelper.CheckKeywordsExist(_logFilePath,keyword)); }
/// <summary> /// 发送文本客服消息 /// </summary> /// <param name="accessTokenOrAppId"></param> /// <param name="openId"></param> /// <param name="content"></param> /// <returns></returns> public override ApiResult SendText(string accessTokenOrAppId, string openId, string content) { SenparcTrace.SendCustomLog("wxTest-sendText", "openID:" + openId + " || appID:" + accessTokenOrAppId + "|| content:" + content); var reuslt = CustomApi.SendText(accessTokenOrAppId, openId, content); return(new ApiResult((int)reuslt.errcode, reuslt.errmsg, reuslt)); }
public void BaseExceptionLogTest() { var keyword = Guid.NewGuid().ToString();//随机字符串 var ex = new BaseException("测试异常:" + keyword); //Log会记录两次,第一次是在BaseException初始化的时候会调用此方法 SenparcTrace.BaseExceptionLog(ex); Assert.IsTrue(UnitTestHelper.CheckKeywordsExist(LogFilePath, "测试异常", keyword)); }
/// <summary> /// BaseException /// </summary> /// <param name="message">异常消息</param> /// <param name="inner">内部异常信息</param> /// <param name="logged">是否已经使用WeixinTrace记录日志,如果没有,BaseException会进行概要记录</param> public BaseException(string message, Exception inner, bool logged = false) : base(message, inner) { if (!logged) { //SenparcTrace.Log(string.Format("BaseException({0}):{1}", this.GetType().Name, message)); SenparcTrace.BaseExceptionLog(this); } }
/// <summary> /// 构造函数 /// </summary> /// <param name="message"></param> /// <param name="typeOfDatabaseConfiguration">DatabaseConfiguration 类型</param> /// <param name="typeOfDbContext">DbContext 类型,如:SenparcEntities</param> /// <param name="inner"></param> public NcfDatabaseException(string message, Type typeOfDatabaseConfiguration, Type typeOfDbContext = null, Exception inner = null) : base(message, inner, true) { message += @$ " DatabaseConfiguration 类型:{(typeOfDatabaseConfiguration == null ? " 未提供 " : typeOfDatabaseConfiguration.Name)} DbContext 类型:{(typeOfDbContext == null ? " 未提供 " : typeOfDbContext.Name)} "; SenparcTrace.BaseExceptionLog(this); }
public IMvcBuilder AuthorizeConfig(IMvcBuilder builder, IHostEnvironment env) { builder.AddRazorPagesOptions(options => { //此处可配置页面权限 }); SenparcTrace.SendCustomLog("Template_XncfName 启动", "完成 Area:Template_OrgName.Xncf.Template_XncfName 注册"); return(builder); }
public IMvcBuilder AuthorizeConfig(IMvcBuilder builder, IHostEnvironment env) { builder.AddRazorPagesOptions(options => { //此处可配置页面权限 }); SenparcTrace.SendCustomLog("Message 启动", "完成 Area:WorkShop.Xncf.Message 注册"); return(builder); }
public IMvcBuilder AuthorizeConfig(IMvcBuilder builder, IWebHostEnvironment env) { builder.AddRazorPagesOptions(options => { //此处可配置页面权限 }); SenparcTrace.SendCustomLog("系统启动", "完成 Area:MyApp 注册"); return(builder); }
/// <summary> /// 获取单个公钥 /// </summary> /// <param name="serialNumber"></param> /// <returns></returns> public async Task <string> GetPublicKeyAsync(string serialNumber, ISenparcWeixinSettingForTenpayV3 tenpayV3Setting) { var keys = await GetPublicKeysAsync(tenpayV3Setting); if (keys.TryGetValue(serialNumber, out string publicKey)) { return(publicKey); } SenparcTrace.BaseExceptionLog(new TenpaySecurityException($"公钥序列号不存在!serialNumber:{serialNumber},TenPayV3Info:{this.ToJson(true)}")); throw new TenpaySecurityException("公钥序列号不存在!请查看日志!", true); }
/// <summary> /// 删除消息 /// </summary> /// <param name="userId"></param> /// <param name="messageDetailId"></param> /// <returns></returns> public async Task <bool> ApiDeleteMessage(string userId, string messageDetailId) { var seh = new SenparcExpressionHelper <MessageDetail>(); SenparcTrace.Log($"userId-----{userId},messageDetailId----${messageDetailId}"); seh.ValueCompare.AndAlso(!string.IsNullOrEmpty(userId), _ => _.UserId.Equals(userId)); seh.ValueCompare.AndAlso(!string.IsNullOrEmpty(messageDetailId), _ => _.Id.Equals(messageDetailId)); var where = seh.BuildWhereExpression(); await base.DeleteAllAsync(where); return(true); }
public void OnLogFuncTest() { var onlogCount = 0; SenparcTrace.OnLogFunc = () => onlogCount++; var keyword = Guid.NewGuid().ToString();//随机字符串 SenparcTrace.SendCustomLog("测试OnLogFuncTest", keyword); Assert.IsTrue(UnitTestHelper.CheckKeywordsExist(LogFilePath, keyword)); Assert.AreEqual(1, onlogCount); }
private void RegisterTraceLogAction() { registerTraceLogActionRun = true; SenparcTrace.SendCustomLog("Test系统日志", "Test系统启动");//只在Senparc.Weixin.Config.IsDebug = true的情况下生效 //自定义日志记录回调 SenparcTrace.OnLogFunc = () => { //加入每次触发Log后需要执行的代码 }; }
/// <summary> /// 运行 /// </summary> /// <param name="param"></param> /// <returns></returns> public override FunctionResult Run(IFunctionParameter param) { /* 这里是处理文字选项(单选)的一个示例 */ return(FunctionHelper.RunFunction <UpdateDocs_Parameters>(param, (typeParam, sb, result) => { var wwwrootDir = Path.Combine(Senparc.CO2NET.Config.RootDictionaryPath, "wwwroot"); var copyDir = Path.Combine(wwwrootDir, "NcfDocs"); //创建目录 FileHelper.TryCreateDirectory(wwwrootDir); FileHelper.TryCreateDirectory(copyDir); var gitUrl = "https://gitee.com/NeuCharFramework/NcfDocs"; try { Repository.Clone(gitUrl, copyDir, new CloneOptions() { IsBare = false }); } catch (Exception) { try { var mergeResult = LibGit2Sharp.Commands.Pull( new Repository(copyDir), new Signature("*****@*****.**", "*****@*****.**", SystemTime.Now), new PullOptions()); sb.AppendLine("已有文件存在,开始 pull 更新"); sb.AppendLine(mergeResult.Status.ToString()); } catch (Exception ex) { SenparcTrace.BaseExceptionLog(ex); } } sb.AppendLine($"仓库创建于 {copyDir}"); UpdateDocs_Version versionData = null; var versionFile = Path.Combine(copyDir, "version.json"); using (var fs = new FileStream(versionFile, FileMode.Open)) { using (var sr = new StreamReader(fs)) { var versionJson = sr.ReadToEnd(); versionData = versionJson.GetObject <UpdateDocs_Version>(); } } result.Message = $"更新成功,当前版本:{versionData.Version},更新时间:{versionData.UpdateTime.ToShortDateString()},What's New:{versionData.WhatsNew ?? "无"}"; })); }
/// <summary> /// 原生支付 模式一 /// </summary> /// <returns></returns> public ActionResult Native() { try { RequestHandler nativeHandler = new RequestHandler(null); string timeStamp = TenPayV3Util.GetTimestamp(); string nonceStr = TenPayV3Util.GetNoncestr(); //商品Id,用户自行定义 string productId = SystemTime.Now.ToString("yyyyMMddHHmmss"); nativeHandler.SetParameter("appid", TenPayV3Info.AppId); nativeHandler.SetParameter("mch_id", TenPayV3Info.MchId); nativeHandler.SetParameter("time_stamp", timeStamp); nativeHandler.SetParameter("nonce_str", nonceStr); nativeHandler.SetParameter("product_id", productId); string sign = nativeHandler.CreateMd5Sign("key", TenPayV3Info.Key); var url = TenPayOldV3.NativePay(TenPayV3Info.AppId, timeStamp, TenPayV3Info.MchId, nonceStr, productId, sign); BitMatrix bitMatrix; bitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, 600, 600); var bw = new ZXing.BarcodeWriterPixelData(); var pixelData = bw.Write(bitMatrix); var bitmap = new System.Drawing.Bitmap(pixelData.Width, pixelData.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb); var fileStream = new MemoryStream(); var bitmapData = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, pixelData.Width, pixelData.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb); try { // we assume that the row stride of the bitmap is aligned to 4 byte multiplied by the width of the image System.Runtime.InteropServices.Marshal.Copy(pixelData.Pixels, 0, bitmapData.Scan0, pixelData.Pixels.Length); } finally { bitmap.UnlockBits(bitmapData); } bitmap.Save(_fileStream, System.Drawing.Imaging.ImageFormat.Png); _fileStream.Seek(0, SeekOrigin.Begin); return(File(_fileStream, "image/png")); } catch (Exception ex) { SenparcTrace.SendCustomLog("TenPayV3.Native 执行出错", ex.Message); SenparcTrace.BaseExceptionLog(ex); throw; } }
internal void Build(IApplicationBuilder app, IXscfRegister register) { var threadRegister = register as IXscfThread; if (threadRegister == null) { return; } var i = 0; //遍历单个 XSCF 内所有线程配置 foreach (var threadInfo in _threadInfoList) { if (threadInfo.Task == null) { continue; } try { i++; //定义线程 Thread thread = new Thread(async() => { SenparcTrace.SendCustomLog("启动线程", $"{register.Name}-{threadInfo.Name}"); await Task.Delay(TimeSpan.FromSeconds(i)); while (true) { try { await threadInfo.Task.Invoke(app, threadInfo); // 建议开发者自己在内部做好线程内的异常处理 } catch (Exception ex) { SenparcTrace.BaseExceptionLog(ex); await threadInfo.ExceptionHandler?.Invoke(ex); } //进行延迟 await Task.Delay(threadInfo.IntervalTime); } }); thread.Name = $"{register.Uid}-{threadInfo.Name ?? Guid.NewGuid().ToString()}"; thread.Start();//启动 Register.ThreadCollection[threadInfo] = thread; } catch (Exception ex) { SenparcTrace.BaseExceptionLog(ex); } } }
/// <summary> /// 获取消息 /// </summary> /// <param name="userId"></param> /// <param name="pageIndex"></param> /// <param name="pageSize"></param> /// <returns></returns> public async Task <IEnumerable <MessageDetailDto> > ApiGetList(string userId, int pageIndex, int pageSize) { List <MessageDetailDto> selectListItems = null; var seh = new SenparcExpressionHelper <MessageDetail>(); SenparcTrace.Log($"userId-----{userId}"); seh.ValueCompare.AndAlso(!string.IsNullOrEmpty(userId), _ => _.UserId.Equals(userId)); var where = seh.BuildWhereExpression(); List <MessageDetail> messageDetails = (await base.GetObjectListAsync(pageIndex, pageSize, where, "AddTime Desc")).ToList(); selectListItems = base.Mapper.Map <List <MessageDetailDto> >(messageDetails); return(selectListItems); }
/// <summary> /// 扫描自动依赖注入的接口 /// </summary> public static IServiceCollection ScanAssamblesForAutoDI(this IServiceCollection services) { //遍历所有程序集进行注册 AssembleScanHelper.AddAssembleScanItem(assembly => { var areaRegisterTypes = assembly.GetTypes() //.GetExportedTypes() .Where(z => !z.IsAbstract && !z.IsInterface && z.GetInterface(nameof(IAutoDI)) != null) .ToArray(); DILifecycleType dILifecycleType = DILifecycleType.Scoped; foreach (var registerType in areaRegisterTypes) { try { //判断特性标签 var attrs = System.Attribute.GetCustomAttributes(registerType, false).Where(z => z is AutoDITypeAttribute); if (attrs.Count() > 0) { var attr = attrs.First() as AutoDITypeAttribute; dILifecycleType = attr.DILifecycleType;//使用指定的方式 } //针对不同的类型进行不同生命周期的 DI 设置 switch (dILifecycleType) { case DILifecycleType.Scoped: services.AddScoped(registerType); break; case DILifecycleType.Singleton: services.AddSingleton(registerType); break; case DILifecycleType.Transient: services.AddTransient(registerType); break; default: throw new NotImplementedException($"未处理此 DILifecycleType 类型:{dILifecycleType.ToString()}"); } } catch (Exception ex) { SenparcTrace.BaseExceptionLog(ex); } } }, false); return(services); }
/// <summary> /// 安装模块 /// </summary> /// <param name="uid">模块 Uid</param> /// <returns></returns> //public async Task<Tuple<PagedList<XncfModule>, string, InstallOrUpdate?>> InstallModuleAsync(string uid) public async Task <(PagedList <XncfModule> XncfModuleList, string scanAndInstallResult, InstallOrUpdate?InstallOrUpdate)> InstallModuleAsync(string uid) { if (uid.IsNullOrEmpty()) { throw new Exception("模块不存在!"); } var xncfRegister = XncfRegisterManager.RegisterList.FirstOrDefault(z => z.Uid == uid); if (xncfRegister == null) { throw new Exception("模块不存在!"); } var xncfModule = await base.GetObjectAsync(z => z.Uid == xncfRegister.Uid && z.Version == xncfRegister.Version).ConfigureAwait(false); if (xncfModule != null) { throw new Exception("相同版本模块已安装,无需重复安装!"); } PagedList <XncfModule> xncfModules = await base.GetObjectListAsync(1, 999, _ => true, _ => _.AddTime, Ncf.Core.Enums.OrderingType.Descending).ConfigureAwait(false); var xncfModuleDtos = xncfModules.Select(z => base.Mapper.Map <CreateOrUpdate_XncfModuleDto>(z)).ToList(); var se = _serviceProvider.GetService(typeof(SystemServiceEntities_SqlServer)); //进行模块扫描 InstallOrUpdate?installOrUpdateValue = null; var result = await Senparc.Ncf.XncfBase.Register.ScanAndInstall(xncfModuleDtos, _serviceProvider, async (register, installOrUpdate) => { installOrUpdateValue = installOrUpdate; //底层系统模块此时还没有设置好初始化的菜单信息,不能设置菜单 if (register.Uid != Senparc.Ncf.Core.Config.SiteConfig.SYSTEM_XNCF_MODULE_SERVICE_UID && register.Uid != Senparc.Ncf.Core.Config.SiteConfig.SYSTEM_XNCF_MODULE_AREAS_ADMIN_UID ) { await InstallMenuAsync(register, installOrUpdate); } }, uid).ConfigureAwait(false); //记录日志 var installOrUpdateMsg = installOrUpdateValue.HasValue ? (installOrUpdateValue.Value == InstallOrUpdate.Install ? "安装" : "更新") : "失败"; SenparcTrace.SendCustomLog($"安装或更新模块({installOrUpdateMsg})", result.ToString()); return(xncfModules, result, installOrUpdateValue); }
public async Task <IActionResult> OnGetLogoutAsync(string ReturnUrl) { SenparcTrace.SendCustomLog("����Ա�˳���¼", $"�û�����{base.UserName}"); await _userInfoService.LogoutAsync(); if (string.IsNullOrEmpty(ReturnUrl)) { return(RedirectToPage(new { area = "Admin" })); } else { return(LocalRedirect(ReturnUrl.UrlDecode())); } }
public void OnBaseExceptionFuncTest() { var onlogCount = 0; SenparcTrace.OnLogFunc = () => onlogCount++; var keyword = Guid.NewGuid().ToString();//随机字符串 var ex = new BaseException("测试异常:" + keyword); //Log会记录两次,第一次是在BaseException初始化的时候会调用此方法 SenparcTrace.BaseExceptionLog(ex); Assert.IsTrue(UnitTestHelper.CheckKeywordsExist(LogFilePath, keyword)); Assert.AreEqual(2, onlogCount); }
/// <summary> /// 设置数据 /// </summary> /// <param name="kindName">统计类别名称</param> /// <param name="value">统计值</param> /// <param name="data">复杂类型数据</param> /// <param name="tempStorage">临时储存信息</param> /// <param name="dateTime">发生时间,默认为当前系统时间</param> /// <returns></returns> public async Task <DataItem> SetAsync(string kindName, double value, object data = null, object tempStorage = null, DateTimeOffset?dateTime = null) { if (!Config.EnableAPM) { return(null);//不启用,不进行记录 } var dataItem = new DataItem() { KindName = kindName, Value = value, Data = data, TempStorage = tempStorage, DateTime = dateTime ?? SystemTime.Now }; MessageQueue.SenparcMessageQueue queue = new MessageQueue.SenparcMessageQueue(); queue.Add($"SenparcAPM-{kindName}-{DateTime.Now.Ticks}", async() => { try { var dt1 = SystemTime.Now; var cacheStragety = Cache.CacheStrategyFactory.GetObjectCacheStrategyInstance(); var finalKey = BuildFinalKey(kindName); //使用同步锁确定写入顺序 using (await cacheStragety.BeginCacheLockAsync("SenparcAPM", finalKey).ConfigureAwait(false)) { var list = await GetDataItemListAsync(kindName).ConfigureAwait(false); list.Add(dataItem); await cacheStragety.SetAsync(finalKey, list, Config.DataExpire, true).ConfigureAwait(false); await RegisterFinalKeyAsync(kindName).ConfigureAwait(false);//注册Key if (SenparcTrace.RecordAPMLog) { SenparcTrace.SendCustomLog($"APM 性能记录 - DataOperation.Set - {_domain}:{kindName}", SystemTime.DiffTotalMS(dt1) + " ms"); } return;// dataItem; } } catch (Exception e) { new APMException(e.Message, _domain, kindName, $"DataOperation.Set - {_domain}:{kindName}"); return;// null; } }); return(dataItem); }
public void AddXscfDatabaseModule(IServiceCollection services) { SenparcTrace.SendCustomLog("执行调试", "DatabaseToolkit.AddXscfDatabaseModule"); services.AddScoped <DbConfig>(); services.AddScoped <SetConfig>(); services.AddScoped <SetConfig.SetConfig_Parameters>(); //AutoMap映射 base.AddAutoMapMapping(profile => { profile.CreateMap <SetConfig.SetConfig_Parameters, SetConfig>(); profile.CreateMap <SetConfig.SetConfig_Parameters, DbConfig>(); }); }
/// <summary> /// 执行微信请求 /// </summary> public override void BuildResponseMessage() { #region NeuChar 执行过程 //var neuralSystem = NeuralSystem.Instance; //var messageHandlerNode = neuralSystem.GetNode("MessageHandlerNode") as MessageHandlerNode; //messageHandlerNode = messageHandlerNode ?? new MessageHandlerNode(); var weixinAppId = this._postModel == null ? "" : this._postModel.AppId; switch (RequestMessage.MsgType) { case RequestMsgType.Text: { //SenparcTrace.SendCustomLog("wxTest-request", RequestMessage.ToJson()); ResponseMessage = CurrentMessageHandlerNode.Execute(RequestMessage, this, weixinAppId) ?? OnTextRequest(RequestMessage as RequestMessageText); //SenparcTrace.SendCustomLog("wxTest-response", ResponseMessage.ToJson()); //SenparcTrace.SendCustomLog("WxOpen RequestMsgType", ResponseMessage.ToJson()); SenparcTrace.SendCustomLog("WXOPEN-TEXT ResponseMessage:", ResponseMessage.ToJson()); } break; case RequestMsgType.Image: { ResponseMessage = CurrentMessageHandlerNode.Execute(RequestMessage, this, weixinAppId) ?? OnImageRequest(RequestMessage as RequestMessageImage); } break; case RequestMsgType.NeuChar: ResponseMessage = OnNeuCharRequestAsync(RequestMessage as RequestMessageNeuChar).GetAwaiter().GetResult(); break; case RequestMsgType.Event: { OnEventRequest(RequestMessage as IRequestMessageEventBase); } break; default: throw new UnknownRequestMsgTypeException("未知的MsgType请求类型", null); } #endregion }