WCF应用程序中的缓存

本文关键字:缓存 应用程序 WCF | 更新日期: 2023-09-27 18:01:46

下面的代码在调用mycache.Get("products")时抛出"Object reference not set to an instance of an object"错误。我使用的是WCF应用程序。我不是100%正确使用缓存。任何建议吗?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Web.Caching; 
namespace DataLayer {
    public class Products
    {
        public List<Product> Current()
        {
            Cache mycache = new Cache();
            if (mycache.Get("products")== null)
            {
                using (DataLayer.AccessDataContext db = new AccessDataContext())
                {
                    var products = from p in db.fldt_product_to_supp_parts
                                   where p.Current
                                   select new Product
                               {
                                   WholesaleCode = p.WholesaleCode,
                                   ProductCode = p.Product_Code
                               };
                    mycache["products"] = products.ToList();
                }
            }
            return mycache["products"] as List<Product>;
        }
    } }

编辑:我使用。net 3.5

WCF应用程序中的缓存

我不确定你的代码有什么问题,因为我不知道Cache是如何实现的,但是稍微搜索一下就发现了以下来自MSDN的Walkthrough:

http://msdn.microsoft.com/en-us/library/dd997362.aspx

缓存WPF应用程序中的应用程序数据

下面的链接给出了一个概述:

http://msdn.microsoft.com/en-us/library/dd997357.aspx

总之,对于。net v4以后,缓存已经从System.Web.Caching移到了System.Runtime.Caching

从文档的外观来看,您不应该创建自己的Cache类实例(它说构造函数仅用于框架使用)。尝试使用Cache.Get代替?

EDIT(回复评论)…

来自MSDN文档:

为每个应用程序域创建该类的一个实例,只要应用程序域保持活动状态,该类就保持有效。关于该类实例的信息可以通过HttpContext对象的Cache属性或Page对象的Cache属性获得。

所以,它看起来像Cache.Get是可用的,当你在一个页面;否则,您可以调用HttpContext.Cache来获取活动缓存。无论哪种方式,您的整个应用程序都有一个单独的Cache对象,您绝对不应该创建自己的CC_9对象。

对于非ASP。. NET应用程序使用System.Runtime.Caching.

你的代码抛出System.NullReferenceException,因为System.Web.Caching.Cache的内部缓存CacheInternal没有使用internal void SetCacheInternal(CacheInternal cacheInternal)方法初始化。它由ASP初始化。

除非我错过了什么,否则您正在尝试在WCF服务中使用asp.net缓存。为了使其工作,您需要使用aspnetcompatibilityrequirementmode枚举来打开asp.net兼容性。如果你是自托管的,你必须自己滚动。

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class CalculatorService : ICalculatorSession
{
}