跨线程访问存储在HttpContext.Current.Items中的数据

时间:2016-06-08 11:42:08

标签: c# caching model-view-controller httpcontext

我目前正在开发一个系统,该系统调用外部服务并缓存HttpContext.Current.Items集合中的一些数据以提高性能。数据可以定期更改,并且用户非常敏感,这就是我们目前仅在当前HttpRequest期间存储数据的原因。

示例:

if (HttpContext.Current.Items[cacheKey] != null)
{
    LogHelper.Debug<ExampleService>("[- CACHED RESULT -] GetUser({0})", () => email);
    return (ExampleUser)HttpContext.Current.Items[cacheKey];
}

using (var client = new UserServiceClient())
{
    using (new OperationContextScope(client.InnerChannel))
    {
        LogHelper.Debug<ExampleService>("GetUser({0})", () => email);
        exampleUser = svc.GetUser(email);
        HttpContext.Current.Items.Add(cacheKey, exampleUser);
    }
}

在我的本地环境中,这表现得如预期的那样,并且大多数情况下也会在请求期间使用相同线程的分段中进行,但是在生产中情况并非如此,并且仍然有多次调用外部服务请求。这可以从日志中看出,这些日志表明在线程ID与原始请求不匹配的情况下,不会返回HttpContext.Current.Items[cacheKey]中的值。

我想这意味着我目前对HttpContext.Current.Items的理解是错误的,并且这不适合我的需求。

因此,我的问题是,这可以在同一个请求中跨线程工作吗?如果是这样,那么还有什么合适的替代方案?

1 个答案:

答案 0 :(得分:0)

一种选择是使用Session来存储您的数据。不幸的是,它不适用于特定于API的请求(例如,移动设备调用服务器API)。此外,服务器会话状态要求所有数据都可序列化(数据库会话状态不可用)。

如果会话不满足您的要求,那么您应该转到下一个选项:使用由代表来自同一用户的请求(a.k.a访问令牌)保护的缓存。

相关问题