我的要求是从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)?
答案 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提供程序的静态实现。