Example #1
0
        };//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()));
            }
        }
Example #3
0
        /// <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));
        }
Example #5
0
        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()}");
        }
Example #6
0
        public MainWindow()
        {
            InitializeComponent();
            SenparcTrace.SendCustomLog("System", "Window opened.");

            txtPath.Text = Environment.CurrentDirectory;
            Init();
        }
Example #7
0
        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));
        }
Example #8
0
        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));
        }
Example #10
0
        public void BaseExceptionLogTest()
        {
            var keyword = Guid.NewGuid().ToString();//随机字符串
            var ex      = new BaseException("测试异常:" + keyword);

            //Log会记录两次,第一次是在BaseException初始化的时候会调用此方法
            SenparcTrace.BaseExceptionLog(ex);
            Assert.IsTrue(UnitTestHelper.CheckKeywordsExist(LogFilePath, "测试异常", keyword));
        }
Example #11
0
 /// <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);
        }
Example #13
0
        public IMvcBuilder AuthorizeConfig(IMvcBuilder builder, IHostEnvironment env)
        {
            builder.AddRazorPagesOptions(options =>
            {
                //此处可配置页面权限
            });

            SenparcTrace.SendCustomLog("Template_XncfName 启动", "完成 Area:Template_OrgName.Xncf.Template_XncfName 注册");

            return(builder);
        }
Example #14
0
        public IMvcBuilder AuthorizeConfig(IMvcBuilder builder, IHostEnvironment env)
        {
            builder.AddRazorPagesOptions(options =>
            {
                //此处可配置页面权限
            });

            SenparcTrace.SendCustomLog("Message 启动", "完成 Area:WorkShop.Xncf.Message 注册");

            return(builder);
        }
Example #15
0
        public IMvcBuilder AuthorizeConfig(IMvcBuilder builder, IWebHostEnvironment env)
        {
            builder.AddRazorPagesOptions(options =>
            {
                //此处可配置页面权限
            });

            SenparcTrace.SendCustomLog("系统启动", "完成 Area:MyApp 注册");

            return(builder);
        }
Example #16
0
        /// <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);
        }
Example #18
0
        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);
        }
Example #19
0
        private void RegisterTraceLogAction()
        {
            registerTraceLogActionRun = true;

            SenparcTrace.SendCustomLog("Test系统日志", "Test系统启动");//只在Senparc.Weixin.Config.IsDebug = true的情况下生效

            //自定义日志记录回调
            SenparcTrace.OnLogFunc = () =>
            {
                //加入每次触发Log后需要执行的代码
            };
        }
Example #20
0
        /// <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 ?? "无"}";
            }));
        }
Example #21
0
        /// <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;
            }
        }
Example #22
0
        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);
        }
Example #24
0
        /// <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);
        }
Example #26
0
        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()));
            }
        }
Example #27
0
        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);
        }
Example #28
0
        /// <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>();
            });
        }
Example #30
0
        /// <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
        }