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
我不确定你的代码有什么问题,因为我不知道Cache
是如何实现的,但是稍微搜索一下就发现了以下来自MSDN的Walkthrough:
缓存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
{
}