首页 > 解决方案 > IIS 托管 WCF 在调用之间共享数据

问题描述

我有一个 WCF Web 服务,它根据为请求者的用户组提供的最后收到的消息 ID 向用户返回数据。我正在查找数据库中是否有相关数据要返回。

我想加快响应时间,所以我想根据上次调用的最后收到的消息 id 来“缓存”数据列表,这样我就不需要每次都在数据库中查找数据以进行重复调用。

您能否建议是否有一种方法可以使用说字典,它将使用 groupID 作为键,值将是包含该组数据的对象(消息 ID 和相关数据)。如果数据将按请求返回,我会将其从字典中删除。

如果在字典中找不到数据,我会尝试从数据库中填充它(基于请求中的最后一条消息 ID)。

标签: wcfiiscaching

解决方案


根据您的描述,我建议您可以在 WCF.NET Framework 4.6.1 中使用 Cache,使您可以在 WCF Web HTTP 服务中使用 ASP.NET 中已有的声明式缓存机制。这允许您缓存来自 WCF Web HTTP 服务操作的响应。

要启用 WEB HTTP 服务缓存,您必须首先通过将 AspNetCompatibilityRequirementsAttribute 应用到服务设置 RequirementsMode 来启用 ASP.NET 兼容性为 Allowed 或 Required。

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]

还要在 Web.config 文件中打开 ASP.NET 兼容模式,如下例所示。

<system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>

AspNetCacheProfileAttribute 属性指定包含要使用的缓存设置的缓存配置文件。

[WebGet]
[AspNetCacheProfile("CacheFor60Seconds")]

AspNetCacheProfileAttribute 指定的缓存配置文件名称标识添加到 Web.config 配置文件的缓存配置文件。缓存配置文件在一个元素中定义,如以下配置示例所示。

<system.web>  
   <caching>  
      <outputCacheSettings>  
         <outputCacheProfiles>  
            <add name="CacheFor60Seconds" duration="60" varyByParam="none" sqlDependency="MyTestDatabase:MyTable"/>  
         </outputCacheProfiles>  
      </outputCacheSettings>  
   </caching>  
   <!-- ... -->  
</system.web>

Demo是Basic Web HTTP Service Caching,更多关于Cache in WCF的信息,请参考以下链接:

https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/caching-support-for-wcf-web-http-services


推荐阅读