[英]Caching in a WCF application
下面的代碼在調用 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 中的以下演練:
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
class 實例(它說構造函數僅供框架使用)。 嘗試改用Cache.Get
嗎?
編輯(回應評論)...
從這里的 MSDN 文檔:
此 class 的一個實例是為每個應用程序域創建的,只要應用程序域保持活動狀態,它就保持有效。 有關此 class 實例的信息可通過 HttpContext object 的 Cache 屬性或頁面 object 的 Cache 屬性獲得。
因此,當您在 Page 中時,看起來Cache.Get
是可用的; 否則你可以調用HttpContext.Cache
來獲取活動緩存。 無論哪種方式,您的整個應用程序都有一個Cache
object,您絕對不應該創建自己的緩存。
對於非 ASP.NET 應用程序使用來自System.Runtime.Caching的緩存。
您的代碼拋出System.NullReferenceException
因為System.Web.Caching.Cache
的內部緩存CacheInternal
未使用internal void SetCacheInternal(CacheInternal cacheInternal)
方法初始化。 它由 System.Web.HttpRuntime class 中的System.Web.HttpRuntime
基礎設施初始化。
除非我遺漏了什么,否則您會嘗試在 WCF 服務中使用 ASP .NET 緩存。 為了使其工作,您需要使用AspNetCompatibilityRequirementsMode Enumeration打開 ASP .NET 兼容性。 如果您是自托管,則必須自己動手。
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class CalculatorService : ICalculatorSession
{
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.