public async Task <IActionResult> Register(RegisterViewModel model) { if (ModelState.IsValid) { User user = new User { Email = model.Email, UserName = model.Login }; var l = await _userman.FindByNameAsync(model.Login); if (l != null && l.UserName == model.Login) { ModelState.AddModelError("", "Пользователь с таким логином уже зарегестрирован"); } if (!user.Email.EndsWith("@gmail.com")) { ModelState.AddModelError("", "Your Email is not correct "); } var result = await _userman.CreateAsync(user, model.Password); if (result.Succeeded) { var code = await _userman.GenerateEmailConfirmationTokenAsync(user); var callbackUrl = Url.Action( "ConfirmEmail", "Account", new { userid = user.Id, code = code }, protocol: HttpContext.Request.Scheme); mailService mailService = new mailService(); await mailService.SendEmailAsyns(model.Email, "Confirm your account", $"Подтвердите регистрацию, перейдя по ссылке: <a href='{callbackUrl}'>link</a>"); await _sigman.SignInAsync(user, false); return(Content("Для завершения регистрации проверьте электронную почту и перейдите по ссылке, указанной в письме")); } else { foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } } return(View()); }
private async void tickEvent(object sender, System.Timers.ElapsedEventArgs e) // 计时器循环事件 { Logger.Debug("计时器循环事件开始执行。"); // 获取宕机数据 var downServers = await fetchDownServer(uri); Logger.Debug("成功获得宕机数据。"); string[] diff; if (downServers.Length > 0) // 存在宕机数据 { Logger.Debug("存在宕机事件。"); // 初始化 ID 组, 缓存目前事件中宕机的 id List <string> existIdGroup = new List <string>(); foreach (var downServer in downServers) { // 缓存 id existIdGroup.Add(downServer.id); // 首先检测一下此 id 是否存在 var ids = downServerIds.ToArray(); if (Array.IndexOf(ids, downServer.id) == -1) // 如果不存在, 那么就开始通知流程 { addLog(downServer.id, "down", downServer.startTs); // 添加故障日志 Logger.Debug("标识:" + downServer.id + ", 初次发现宕机, 开始通知流程。"); // 首先,初始化 down var child = new down() { id = downServer.id, startTS = downServer.startTs }; var starTime = ConvertTimeStampToDateTime(child.startTS); // 把记录写入缓存列表 downServerIds.Add(downServer.id); downServerList.Add(child); Logger.Debug("标识:" + downServer.id + ", 已经将信息写入缓存列表。"); // 发送通知任务 Logger.Debug("标识:" + downServer.id + " -> 开始读取配置项, 并执行配置映射。"); // 读取配置 var parser = new FileIniDataParser(); IniData config = parser.ReadFile(configFile); // 映射配置 string[] groups = config["notification"]["group"].Split(','); string[] mails = config["notification"]["mail"].Split(','); // 1. 发送给 QQ 群组 Logger.Debug("标识:" + downServer.id + " -> 开始通知群组。"); foreach (var group in groups) { #pragma warning disable CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法 Task.Factory.StartNew(() => { using (var robotSession = MahuaRobotManager.Instance.CreateSession()) { var api = robotSession.MahuaApi; string msg = "警报, 一言节点出现故障!\r\n" + "节点标识: " + downServer.id + "\r\n" + "触发时间: " + starTime.ToString("s") + "\r\n" + fetchHitokotoText(); api.SendGroupMessage(group, msg); Logger.Debug("标识:" + downServer.id + " -> 已通知群组: " + group); } }); #pragma warning restore CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法 } // 2. 发送广播邮件 Logger.Debug("标识:" + downServer.id + " -> 开始邮件通知。"); #pragma warning disable CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法 Task.Factory.StartNew(() => { var smtp = new mailService(); var sub = "一言故障警告"; var msg = "警报, 一言节点出现故障。\r\n" + "节点标识: " + downServer.id + "\r\n" + "触发时间: " + starTime.ToString("s") + "\r\n" + fetchHitokotoText(); smtp.Send(mails, sub, msg); Logger.Debug("标识:" + downServer.id + " -> 已通知邮件: " + mails.ToString()); }); #pragma warning restore CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法 Logger.Debug("标识:" + downServer.id + " -> 同步任务已经完成, 请等待异步程序执行完毕。"); } } // 求当前宕机列表和缓存列表的补集, 然后通知 Logger.Debug("正在求当前宕机列表和缓存列表的补集..."); diff = downServerIds.ToArray().Where(c => !existIdGroup.ToArray().Contains(c)).ToArray(); } else { diff = downServerIds.ToArray(); // 既然宕机列表不存在, 说明所有节点正常。 如果缓存存在内容, 全部释放。 } if (diff.Length > 0) // 缓存区 ids 多于目前宕机的 ids, 所以有节点恢复了。 发生恢复行为 { Logger.Debug("补集不为空集, 进行恢复事件。"); foreach (var id in diff) { DateTime startTime = DateTime.Now; // 从缓存区移除 Logger.Debug("标识:" + id + " -> 从缓存区中移除纪录。"); downServerIds.RemoveAll(c => downServerIds.Contains(c)); for (int i = downServerList.Count - 1; i >= 0; i--) { if (downServerList[i].id == id) { startTime = ConvertTimeStampToDateTime(downServerList[i].startTS); downServerList.RemoveAt(i); } } // 获取持续时间 var now = DateTime.Now; var distance = now - startTime; var last = distance.Days + " 天 " + distance.Hours + " 时 " + distance.Minutes + " 分 " + distance.Seconds + " 秒 "; addLog(id, "up", ConvertDateTimeToTimeStamp(now)); Logger.Debug("标识:" + id + " -> 开始读取配置项, 并执行配置映射。"); // 读取配置 var parser = new FileIniDataParser(); IniData config = parser.ReadFile(configFile); // 映射配置 string[] groups = config["notification"]["group"].Split(','); string[] mails = config["notification"]["mail"].Split(','); // 1. 发送给 QQ 群组 Logger.Debug("标识:" + id + " -> 开始通知群组。"); foreach (var group in groups) { #pragma warning disable CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法 Task.Factory.StartNew(() => { using (var robotSession = MahuaRobotManager.Instance.CreateSession()) { var api = robotSession.MahuaApi; string msg = "一言节点已从故障中恢复。\r\n" + "节点标识: " + id + "\r\n" + "持续时间: " + last + "\r\n" + fetchHitokotoText(); api.SendGroupMessage(group, msg); Logger.Debug("标识:" + id + " -> 已通知群组: " + group); } }); #pragma warning restore CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法 } // 2. 发送广播邮件 Logger.Debug("标识:" + id + " -> 开始邮件通知。"); #pragma warning disable CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法 Task.Factory.StartNew(() => { var smtp = new mailService(); var sub = "一言已从故障中恢复"; var msg = "一言节点已从故障中恢复。\r\n" + "节点标识: " + id + "\r\n" + "持续时间: " + last + "\r\n" + fetchHitokotoText(); smtp.Send(mails, sub, msg); Logger.Debug("标识:" + id + " -> 已通知邮件: " + mails.ToString()); }); #pragma warning restore CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法 Logger.Debug("标识:" + id + " -> 同步任务已经完成, 请等待异步程序执行完毕。"); } } dumpData(); }