我需要在每个请求上读取一个几乎静态的 JSON 文件。我正在使用面向 .NET 4.5 的 ASP.NET Web API 2。我曾打算使用 System.Runtime.Caching.Memory 缓存。我在委托消息处理程序中使用这个缓存。令我惊讶的是,缓存根本不起作用。每次请求到来时,缓存键似乎都不存在,它只是不断地加载文件。为了测试相同,我使用了 IIS Express 8.0 并使用了断点 n 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 段中放置断点时,我看到内容总是从文件中加载,而不是在任何情况下从缓存中加载。如果我遗漏了什么,你能告诉我吗?