2011-07-12 9 views
1

以下のコードは、mycache.Get( "products")を呼び出すときに"Object reference not set to an instance of an object"のエラーをスローします。私はWCFアプリケーションを使用しています。私は100%ではないキャッシュを正しく使用しています。何かアドバイス?WCFアプリケーションでのキャッシュ

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>; 
     } 

    } } 

EDIT:私はCacheがどのように実装されるか、オフ手知らないので、私は、あなたのコードに問題があるかわからないんだけど、.NET 3.5

+1

私はあなたの質問の残りの部分で "WCF"と読むようにあなたのタイトルを修正しました - 私は正しいことを願っています! –

答えて

1

ドキュメントの外観から、Cacheクラスの独自のインスタンスを作成すべきではありません(コンストラクタはフレームワーク専用です)。代わりにCache.Getをお試しください。

EDIT(コメントに応答して) ... MSDNのドキュメントhereから

一つ、このクラスのインスタンスは、アプリケーションドメインごとに作成し、それは限り有効のままですアプリケーションドメインはアクティブのままです。このクラスのインスタンスに関する情報は、HttpContextオブジェクトのCacheプロパティまたはPageオブジェクトのCacheプロパティから取得できます。

したがって、ページ内にあるときはCache.Getのように見えます。それ以外の場合は、HttpContext.Cacheを呼び出してアクティブなキャッシュを取得できます。いずれにしても、アプリケーション全体に単一のCacheオブジェクトがあり、は間違いなくで自分自身を作成し​​てはいけません。

+0

キャッシュに入れて静的メソッドを見つけることができません。 –

+0

HttpContextは、その1つの要求に対するキャッシュを提供します。Idealy私は、アプリケーション全体にわたりASPXサイトのアプリケーションキャッシュのようなものを、オブジェクトをキャッシュしたいです。私が引用されたドキュメントを1として –

+0

:「このクラスの1つのインスタンスがアプリケーションドメインごとに作成されています。」 –

2

を使用していますMSDNから、次のチュートリアル明らかに少し検索:WPFアプリケーション

0123で

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

キャッシュアプ​​リケーションデータ

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

要約すると、以降の.NET V4のために、キャッシングはSystem.Web.CachingからSystem.Runtime.Cachingに移動されたことが表示されます:

そして、次のリンクは、概要を説明します。

0

ASP.NET以外のアプリケーションの場合は、System.Runtime.Cachingからのキャッシュを使用します。

内部キャッシュCacheInternalSystem.Web.Caching.Cacheinternal void SetCacheInternal(CacheInternal cacheInternal)メソッドを使用して初期化されていないため、コードにSystem.NullReferenceExceptionがスローされます。 ASP.NETインフラストラクチャによってSystem.Web.HttpRuntimeクラスに初期化されます。

0

何かが欠けていない限り、WCFサービス内でASP .NETキャッシュを使用しようとしています。これを機能させるには、AspNetCompatibilityRequirementsMode Enumerationを使用してASP .NET互換性を有効にする必要があります。あなたがセルフホスティングをしているのなら、あなた自身をロールバックする必要があります。

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

} 
関連する問題