0

我需要在每个请求上读取一个几乎静态的 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 段中放置断点时,我看到内容总是从文件中加载,而不是在任何情况下从缓存中加载。如果我遗漏了什么,你能告诉我吗?

4

0 回答 0