【问题标题】:Caching ASP.NET users related data within WCF service在 WCF 服务中缓存 ASP.NET 用户相关数据
【发布时间】:2011-04-13 15:49:26
【问题描述】:

我的要求是从后面的 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 服务会认为只有 1 个客户端(网站调用托管在 IIS 中的 webserivce)。
用户未经身份验证 - 他们是匿名用户。


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

InstanceContextMode =InstanceContextMode.Single

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

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

提前感谢所有帮助。

编辑:
在对InstanceContextMode =InstanceContextMode.Single 进行了更多思考之后,我认为这不是与 ASP.NET 一起使用的最佳选择,因为如果 100 个用户同时调用 Web 服务,我将获得 100 个顺序调用,这将导致性能问题。
在那种情况下,您有什么想法如何在不更改 InstanceContextMode 设置的情况下实现这一点(据我所知,默认情况下是 PerSession)?

【问题讨论】:

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


    【解决方案1】:

    我认为,保持

    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提供者的静态实现。

    【讨论】:

    • 感谢您的回复。我在考虑 InstanceContextMode.Single,现在我想我不能使用它......请参阅我的编辑以获取更多详细信息。如果您有任何其他想法如何实施,请告诉我。谢谢
    • 可以考虑改变Throttling行为&和并发模式。
    • 请查看我之前回答的编辑,如果解决方案可以解决您的问题,请不要忘记将其标记为答案:-))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 2018-10-27
    相关资源
    最近更新 更多