29

コンテキスト: .Net 3.5、C#
コンソール アプリケーションにキャッシュ メカニズムが必要です。
車輪を再発明する代わりに、使用したいと思いますSystem.Web.Caching.Cache(これは最終決定です。他のキャッシング フレームワークは使用できません。理由は聞かないでください)。
ただし、System.Web.Caching.Cache有効な HTTP コンテキストでのみ実行されるようになっているようです。私の非常に単純なスニペットは次のようになります。

using System;
using System.Web.Caching;
using System.Web;

Cache c = new Cache();

try
{
    c.Insert("a", 123);
}
catch (Exception ex)
{
    Console.WriteLine("cannot insert to cache, exception:");
    Console.WriteLine(ex);
}

結果は次のとおりです。

キャッシュに挿入できません。例外:
System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。
   System.Web.Caching.Cache.Insert (文字列キー、オブジェクト値) で
   MyClass.RunSnippet() で

明らかに、私はここで何か間違ったことをしています。何か案は?


更新HttpRuntime.Cache:ほとんどの回答に+1、静的メソッドを介してキャッシュを取得するのが正しい使い方HttpContext.Current.Cacheです。皆さん、ありがとうございました!

4

6 に答える 6

56

Cache コンストラクターのドキュメントには、内部使用のみであると記載されています。Cache オブジェクトを取得するには、コンストラクターを介してインスタンスを作成するのではなく、HttpRuntime.Cache を呼び出します。

于 2009-06-24T11:23:21.047 に答える
28

OPはv3.5を指定しましたが、v4がリリースされる前に質問がありました。この質問を見つけ、v4 依存関係を維持できる人を支援するため、フレームワーク チームは、このタイプのシナリオ用に新しい汎用キャッシュを作成しました。System.Runtime.Caching 名前空間にあります: http://msdn.microsoft.com/en-us/library/dd997357%28v=VS.100%29.aspx

デフォルトのキャッシュ インスタンスへの静的参照は、MemoryCache.Default です。

于 2010-05-05T08:05:20.707 に答える
9

車輪の再発明をしたくない場合は、 Caching Application Blockを使用してください。それでも ASP.NET キャッシュを使用する場合は、こちらを参照してください。ただし、これは.NET 2.0以降でのみ機能すると確信しています。.NET 1 では、ASP.NET の外部でキャッシュを使用することはできませんでした。

MSDN のキャッシュ ドキュメントのページにも大きな警告があります。

Cache クラスは、ASP.NET アプリケーション以外で使用するためのものではありません。Web アプリケーションにキャッシュを提供するために、ASP.NET で使用するために設計およびテストされました。コンソール アプリケーションや Windows フォーム アプリケーションなど、他の種類のアプリケーションでは、ASP.NET キャッシュが正しく機能しない場合があります。

有効期限などを心配する必要がない非常に軽量なソリューションの場合、辞書オブジェクトで十分です。

于 2009-06-24T11:13:09.490 に答える
4

私は同じことを疑問に思ってこのページを終了しました。これが私がやっていることです(私は好きではありませんが、うまくいくようです):

HttpContext context = HttpContext.Current;
if (context == null)
{
    HttpRequest request = new HttpRequest(string.Empty, "http://tempuri.org", string.Empty);
    HttpResponse response = new HttpResponse(new StreamWriter(new MemoryStream()));
    context = new HttpContext(request, response);
    HttpContext.Current = context;
}
this.cache = context.Cache;
于 2010-02-01T22:49:04.723 に答える
1

試す

public class AspnetDataCache : IDataCache
{
    private readonly Cache _cache;

    public AspnetDataCache(Cache cache)
    {
        _cache = cache;
    }

    public AspnetDataCache()
        : this(HttpRuntime.Cache)
    {

    }
    public void Put(string key, object obj, TimeSpan expireNext)
    {
        if (key == null || obj == null)
            return;
        _cache.Insert(key, obj, null, DateTime.Now.Add(expireNext), TimeSpan.Zero);
    }

    public object Get(string key)
    {
        return _cache.Get(key);
    }

于 2009-06-24T11:25:29.840 に答える
1

System.Web.Caching.Cache クラスは、そのメンバー "_cacheInternal" が HttpRuntime オブジェクトによって設定されていることに依存しています。

System.Web.Caching クラスを使用するには、HttpRuntime オブジェクトを作成し、HttpRuntime.Cache プロパティを設定する必要があります。IIS を効果的にエミュレートする必要があります。

次のような他のキャッシング フレームワークを使用することをお勧めします。

于 2009-06-24T11:28:35.310 に答える