Wie kann ich System.Web.Caching.Cache in einer Konsolenanwendung?
-
10-07-2019 - |
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!
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: