У меня есть требование читать практически статический файл JSON при каждом запросе. Я использую веб-API ASP.NET 2, ориентированный на .NET 4.5. Я намеревался использовать для этого кеш System.Runtime.Caching.Memory. Я использую это кеширование в обработчике сообщений делегирования. К моему удивлению, кеш совсем не работает. Каждый раз, когда приходит запрос, похоже, что ключ кеша не существует, и он просто продолжает кодировать файл. Чтобы проверить то же самое, я использовал IIS Express 8.0 и точку останова в VS 2012.
Мой код такой, как показано ниже
public class AuthenticationHandler:DelegatingHandler
{
ObjectCache currentCache = MemoryCache.Default;
protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
if (!request.Headers.Contains("source"))
request.Headers.Add("source", "1");
var exclusionList = GetFromCache();
if (exclusionList.Exists(item => request.RequestUri.OriginalString.ToLower().Contains(item.ToLower())))
{
return base.SendAsync(request, cancellationToken);
}
else if (request.Headers.Contains("id"))
{
return base.SendAsync(request, cancellationToken);
}
else
{
TaskCompletionSource<HttpResponseMessage> responseMessageTask = new TaskCompletionSource<HttpResponseMessage>();
HttpResponseMessage response = request.CreateErrorResponse(System.Net.HttpStatusCode.BadRequest, "Session id not present in the header");
responseMessageTask.SetResult(response);
return responseMessageTask.Task;
}
}
private List<string> GetFromCache()
{
//ObjectCache currentCache = MemoryCache.Default;
//var currentCache = HttpContext.Current.Cache;
CacheItemPolicy expirationPolicy = new CacheItemPolicy();
var exclusionList = currentCache.Get("__ExclusionList") as List<string>;
if (exclusionList == null)
{
string filePath = HostingEnvironment.MapPath("~/config/Exclusion.config");
string jsonConfig = File.ReadAllText(filePath);
exclusionList = JsonConvert.DeserializeObject<List<string>>(jsonConfig);
CacheItem item = new CacheItem("__ExclusionList");
item.Value = exclusionList;
expirationPolicy.ChangeMonitors.Add(new HostFileChangeMonitor(new List<string>() { filePath }));
}
return exclusionList;
}
}
В функции GetFromCache, когда я помещаю точку останова в сегмент if, я вижу, что содержимое всегда загружается из файла, а не из кеша в любом случае. Подскажите, пожалуйста, если я что-то упускаю?