簡體   English   中英

在 WCF 應用程序中緩存

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM