예제 #1
0
        /// <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}");
        }
예제 #2
0
        /// <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);
        }