Frage

Kontext: .Net 3.5, C #
Ich möchte Caching-Mechanismus in meiner Konsolenanwendung haben.
Statt neu zu erfinden das Rad, ich System.Web.Caching.Cache verwenden möchte (und das ist eine endgültige Entscheidung, ich kann nicht anderen Caching-Framework verwenden, fragen Sie nicht, warum).
Allerdings sieht es aus wie System.Web.Caching.Cache sollte nur in einem gültigen HTTP-Kontext auszuführen. Meine sehr einfach Schnipsel sieht wie folgt aus:

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

und das Ergebnis ist:

cannot insert to cache, exception:
System.NullReferenceException: Object reference not set to an instance of an object.
   at System.Web.Caching.Cache.Insert(String key, Object value)
   at MyClass.RunSnippet()

So offensichtlich, ich bin hier etwas falsch zu machen. Irgendwelche Ideen?


Aktualisieren : +1 auf den meisten Antworten, über statische Methoden, um den Cache immer ist die korrekte Verwendung, nämlich HttpRuntime.Cache und HttpContext.Current.Cache. Vielen Dank an alle!

War es hilfreich?

Lösung

Die Dokumentation für die Cache-Konstruktor sagt, dass es nur für den internen Gebrauch bestimmt. Um Ihr Cache-Objekt zu erhalten, rufen HttpRuntime.Cache anstatt eine Instanz über den Konstruktor zu schaffen.

Andere Tipps

Während der OP v3.5 angegeben, wurde die Frage gestellt, bevor v4 veröffentlicht wurde. Damit jeden, der diese Frage findet und kann mit einer v4 Abhängigkeit lebt, erstellt das Framework-Team eine neue Allzweck-Cache für diese Art von Szenario. Es ist in der System.Runtime.Caching Namespace: http://msdn.microsoft.com/en -US / library / dd997357% 28v = VS.100% 29.aspx

Der statische Verweis auf die Standard-Cache-Instanz ist: MemoryCache.Default

Verwenden Sie einfach die Caching Application Block , wenn Sie nicht wollen, das Rad neu zu erfinden. Wenn Sie immer noch die ASP.NET cache- siehe hier . Ich bin mir ziemlich sicher, dass dies nur wenn auch mit .NET 2.0 und höher funktioniert. Es war einfach nicht möglich, den Cache außerhalb von ASP.NET in 1 .NET zu verwenden.

MSDN hat eine schöne große Warnung auf der Seite für die Cache-Dokumentation zu:

  

Die Cache-Klasse ist nicht für   Verwendung außerhalb von ASP.NET-Anwendungen.   Es wurde entwickelt und für den Einsatz getestet   ASP.NET bereitzustellen Caching für Web   Anwendungen. Bei anderen Arten von   Anwendungen, wie Konsole   Anwendungen oder Windows Forms   Anwendungen, ASP.NET-Caching könnte   nicht korrekt funktionieren.

Für eine sehr leichte Lösung, wo Sie müssen über Ablauf keine Sorge etc, dann ein Wörterbuch Objekt könnte ausreichen.

ich auf dieser Seite beenden das Gleiche fragen. Hier ist, was ich tue (was ich mag es nicht, aber es scheint ganz gut zu funktionieren):

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;

Versuchen

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

Die System.Web.Caching.Cache Klasse beruht auf, dessen Mitglied „_cacheInternal“ gesetzt durch das Httpruntime-Objekt.

die System.Web.Caching Klassen nutzen zu können, die HttpRuntime.Cache Eigenschaft ein Httpruntime Objekt und das Setup erstellen haben würde. Sie würden effektiv IIS zu emulieren haben.

Sie sind besser mit anderen Caching-Frameworks wie:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top