Beispiel #1
0
        public async Task <ActionResult> List([FromServices] ISearchProvider searchProvider, int?id, SearchModel search, int page = 1)
        {
            int pagesize = ListPageSize;

            search = search ?? new SearchModel();
            if (id.HasValue && id.Value > 0)
            {
                if (!_catUtil.GetCategoryList().Any(l => l.CategoryID == id.Value))
                {
                    return(NotFound());
                }
                search.CurrentCategory = id;
                ViewBag.CategoryId     = id;
            }
            if (IsHarmony)
            {
                search.Harmony = IsHarmony;
            }
            ViewBag.CurrentSort = search.SortOptions();
            ViewBag.SearchModel = search;

            var cache = _cache.Get <ConcurrentDictionary <string, Task <SearchBlogResult> > > (CacheService.BlogListCacheKey);

            Func <string, object, ActionResult> Result = View;

            if (Request.IsAjaxRequest())
            {
                Result = PartialView;
            }
            SearchBlogResult result;

            if (search.Cacheable())
            {
                var cachekey = search.CacheKey(page, pagesize);
                cache  = cache ?? new ConcurrentDictionary <string, Task <SearchBlogResult> >();
                result = await cache.GetOrAdd(cachekey, (s) =>
                {
                    _cache.Set(CacheService.BlogListCacheKey, cache, new MemoryCacheEntryOptions()
                    {
                        Priority = CacheItemPriority.NeverRemove
                    });
                    return(searchProvider.SearchBlogAsync(search, page, pagesize));
                });

                if (result.HasError)
                {
                    cache.TryRemove(cachekey, out var removed);
                    throw new TimeoutException("查询搜索服务器失败,请刷新重试");
                }
            }
            else
            {
                result = await searchProvider.SearchBlogAsync(search, page, pagesize);
            }
            return(Result("List", result));
        }