/// <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}"); }
/// <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); }