在WCF服务中缓存ASP.NET用户相关数据

时间:2010-09-17 10:07:23

标签: asp.net wcf web-services session caching

我的要求是从ASP.NET代码调用WCF Web服务并传递一些数据,例如:

void Add(int x, int y);

操作结果应以某种方式存储在WCF Web服务(成员变量)中。 以后的用户应该可以打电话

double Equals();

并获得操作的结果。当然,因为它是一个开放的网站,许多未经过身份验证的用户可以打开ASP.NET页面并调用Web服务。

或者,Add方法可以返回可用于获取结果的“key”,例如:

Guid Add(int x, int y);
double Equals(Guid key);

我认为我不能使用WCF会话,因为Web服务会认为只有一个客户端(WebSite调用IIS中托管的webserivce)。
用户未经过身份验证 - 他们是匿名用户。


我可以使用:(请查看我的编辑)

InstanceContextMode =InstanceContextMode.Single

作为我的网络服务和商店Dictionary<key, result>的属性,但问题是我什么时候可以从词典中删除条目?
我是否应该使用某种BackgroundWorker来检查每个例如字典15分钟并删除旧条目?在这种情况下,我必须针对每个条目存储DateTime,但如果这是实现此解决方案的最佳方式,那么这不是问题...

我的示例Add / Equals方法仅用于说明问题,实际需求需要为每个用户存储比简单double结果更多的数据

提前感谢所有的帮助。

修改
在考虑了InstanceContextMode =InstanceContextMode.Single之后我认为它不是与ASP.NET一起使用的最佳选择,因为如果100个用户同时调用Web服务,我将获得100次顺序调用,这将导致性能问题。 /> 在这种情况下,您是否有任何想法如何实现这一点而不更改InstanceContextMode设置(据我所知默认为PerSession)?

1 个答案:

答案 0 :(得分:0)

我认为,保持

InstanceContextMode =InstanceContextMode.Single 

作为服务行为,如果您的体系结构允许,您可以使用在静态类中实现的System.Web.Caching.Cache对象(以便它只被实例化一次),您可以在其中指定缓存依赖项/到期时间等因此您可以获得缓存服务提供的完整功能集,而不是自己实现。

修改 如果您的主要目的是关于缓存,那么您甚至不需要使用实例上下文模式。您可以根据System.Web.Caching.Cache简单地实现自己的静态缓存提供程序,并传递cacheKey,如以下示例所示:

 public int Add(int a, int b)
        {
            string cacheKey = a.ToString()+b.ToString();
            if (!CacheProvider.Contains(cacheKey))
            {
                CacheProvider.Add(cacheKey, a + b);
                return a + b;
            }
            else
            {
                return (int)CacheProvider.GetValue(cacheKey);
            }

        }

上面代码中的CacheProvider是Cache提供程序的静态实现。