/// <summary> /// Генерация короткой ссылки (используя особый механизм) /// </summary> /// <param name="nativeLink">Исходная ссылка</param> /// <returns>Укороченная ссылка</returns> public static async Task <string> GetNewShortLinkAsync(string nativeLink) { var dbLinks = new DbLinks(); //1. Проверка сгенерированной ссылки на занятость string shortUrl; ShortLink existShortUrl; do { shortUrl = GenerateIdentifier(ShortUrlCharset, ShortUrlLength); existShortUrl = await dbLinks.GetNativeLinkCachedAsync(shortUrl); } while (shortUrl.Equals(existShortUrl?.ShortUrl)); /*2. Запись в кеш ссылок, свежесгенерированной ссылки, для моментального использования + что бы не получилось что в БД еще пусто. * т.к. по статистике она сразу же будет использована создателем для проверки работоспособности.*/ //CacheClient.SetCachedObject(shortUrl, nativeLink, TimeSpan.FromMinutes(CasheConfig.LinksDefaultCachePeriodInMinutes)); //TODO 3. Запись в БД отдельной задачей Task.Run или скорее всего через async (еще протестирую производительность) ThreadPool.QueueUserWorkItem(async q => { try { await dbLinks.SaveLink(shortUrl, nativeLink); } catch (Exception ex) { //ToDo подключить логирование } }); //Task.Run(async () => await dbLinks.SaveLink(shortLink, nativeLink)); return($"{_hostUrl}/{shortUrl}"); }
public void Add(String table, DbLinks link, LinkCondition condition = null) { Dictionary <DbLinks, LinkCondition> linker = new Dictionary <DbLinks, LinkCondition>(); linker.Add(link, condition); this.links.Add(table, linker); }
/// <summary> /// Открытие длинной ссылки, через короткую, с засчитываем клика и т.д. /// </summary> /// <param name="shortUrl"></param> /// <returns>Выдает длинную ссылку</returns> public static async Task <string> OpenShortUrl(string shortUrl) { var dbLinks = new DbLinks(); var link = await dbLinks.GetNativeLinkCachedAsync(shortUrl).ConfigureAwait(false); if (link != null) { await LinkStatisticCounter.AddRedirectLinkCount(link.Id).ConfigureAwait(false); } return(link?.NativeUrl); }
//调试修改添加 private void GetAllDbLinks() { UserConfigHelper.GetConfig(); //RDIFramework.Utilities.UserInfo user = new RDIFramework.Utilities.UserInfo(); this.UserInfo.OpenId = "7d46323d-0091-4bf5-8a13-67fef63a4cd4"; this.UserInfo.Id = "26F43BC9-AE6D-42D2-BAC9-F4237A949484"; this.UserInfo.Code = "Administrator"; this.UserInfo.RealName = "Administrator"; this.UserInfo.IsAdministrator = true; DataTable dtDbLinks = RDIFrameworkService.Instance.DbLinkDefineService.GetDT(this.UserInfo); if (dtDbLinks != null && dtDbLinks.Rows.Count > 0) { foreach (DataRow dataRow in dtDbLinks.Rows) { ConnectString connStr = new ConnectString { LinkName = dataRow[CiDbLinkDefineTable.FieldLinkName].ToString() }; string dbType = dataRow[CiDbLinkDefineTable.FieldLinkType].ToString(); switch (dbType.ToUpper()) { case "ACCESS": connStr.DbType = CurrentDbType.Access; break; case "ORACLE": connStr.DbType = CurrentDbType.Oracle; break; case "MYSQL": connStr.DbType = CurrentDbType.MySql; break; case "SQLLITE": connStr.DbType = CurrentDbType.SQLite; break; case "DB2": connStr.DbType = CurrentDbType.DB2; break; default: connStr.DbType = CurrentDbType.SqlServer; break; } connStr.DbLink = dataRow[CiDbLinkDefineTable.FieldLinkData].ToString(); DbLinks.Add(connStr); } } }
private void GetAllDbLinks() { var dtDbLinks = RDIFrameworkService.Instance.DbLinkDefineService.GetDT(this.UserInfo); if (dtDbLinks == null || dtDbLinks.Rows.Count <= 0) { return; } foreach (DataRow dataRow in dtDbLinks.Rows) { var connStr = new ConnectString { LinkName = dataRow[CiDbLinkDefineTable.FieldLinkName].ToString(), DbLink = dataRow[CiDbLinkDefineTable.FieldLinkData].ToString() }; string dbType = dataRow[CiDbLinkDefineTable.FieldLinkType].ToString(); switch (dbType.ToUpper()) { case "ACCESS": connStr.DbType = CurrentDbType.Access; break; case "ORACLE": connStr.DbType = CurrentDbType.Oracle; break; case "MYSQL": connStr.DbType = CurrentDbType.MySql; break; case "SQLLITE": connStr.DbType = CurrentDbType.SQLite; break; case "DB2": connStr.DbType = CurrentDbType.DB2; break; default: connStr.DbType = CurrentDbType.SqlServer; break; } DbLinks.Add(connStr); } }
public DbTablesLinks(String table, DbLinks link, LinkCondition condition = null) { this.links = new Dictionary <String, Dictionary <DbLinks, LinkCondition> >(); this.Add(table, link, condition); }
public void AddDbLink(String table, DbLinks link, LinkCondition condition = null) { this.dbTablesLinks.Add(table, link, condition); }