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