كيف يمكنني استخدام System.Web.Caching.Cache في تطبيق وحدة التحكم؟

StackOverflow https://stackoverflow.com/questions/1037695

سؤال

سياق:.نت 3.5، سي #
أرغب في الحصول على آلية التخزين المؤقت في تطبيق وحدة التحكم الخاص بي.
بدلاً من إعادة اختراع العجلة، أود استخدامها 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);
}

والنتيجة هي:

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()

من الواضح أنني أفعل شيئًا خاطئًا هنا.أيه أفكار؟


تحديث:إجراء 1+ لمعظم الإجابات، فإن الحصول على ذاكرة التخزين المؤقت عبر الطرق الثابتة هو الاستخدام الصحيح، أي HttpRuntime.Cache و HttpContext.Current.Cache.شكرا لكم جميعا!

هل كانت مفيدة؟

المحلول

وثائق منشئ ذاكرة التخزين المؤقت وتقول انه للاستخدام الداخلي فقط. للحصول على جسم ذاكرة التخزين المؤقت، اتصل HttpRuntime.Cache بدلا من إنشاء مثيل عبر المنشئ.

نصائح أخرى

وحين تحديد OP V3.5، تم طرح السؤال قبل أن يطلق V4. لمساعدة أي شخص الذي يجد هذا السؤال <م> و يمكن أن يعيش مع تبعية V4، إنشاء فريق الإطار على مخبأ للأغراض العامة جديد لهذا النوع من السيناريو. انها في مساحة الاسم System.Runtime.Caching: http://msdn.microsoft.com/en -US / مكتبة / dd997357٪ 28V = VS.100٪ 29.aspx

والإشارة ثابتة إلى مثيل مخبأ الافتراضية هي: MemoryCache.Default

ومجرد استخدام التخزين المؤقت كتلة تطبيق إذا كنت لا تريد لإعادة اختراع العجلة. إذا كنت لا تزال ترغب في استخدام ASP.NET cache- <لأ href = "http://codemaverick.blogspot.com/2007/01/caching-in-windows-application-i-was_8639.html" يختلط = "noreferrer" > نرى هنا . وأنا متأكد من هذا يعمل فقط مع الصافي 2.0 وما فوق على الرغم من. كان ببساطة غير ممكن لاستخدام ذاكرة التخزين المؤقت خارج ASP.NET في. NET 1.

وMSDN لديه تحذير كبيرة لطيفة على الصفحة لتوثيق ذاكرة التخزين أيضا:

<اقتباس فقرة>   

لا يقصد الطبقة ذاكرة التخزين المؤقت ل   استخدام خارج تطبيقات ASP.NET.   تم تصميمه واختباره لاستخدامها في   ASP.NET لتوفير التخزين المؤقت لويب   التطبيقات. في أنواع أخرى من   التطبيقات، مثل وحدة التحكم   التطبيقات أو نماذج Windows   التطبيقات، قد التخزين المؤقت ASP.NET   لا تعمل بشكل صحيح.

لحل خفيفة الوزن للغاية، حيث لم يكن لديك ما يدعو للقلق انتهاء الخ، ثم كائن القاموس يمكن أن يكون كافيا.

وانتهى في هذه الصفحة يتساءل نفس الشيء. وإليك ما أقوم به (أي أنا لا أحب لكن يبدو أن تعمل على ما يرام):

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;

وحاول

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

تعتمد فئة System.Web.Caching.Cache على تعيين العضو الخاص بها "_cacheInternal" بواسطة كائن HttpRuntime.

لاستخدام فئات System.Web.Caching، يجب عليك إنشاء كائن HttpRuntime وإعداد خاصية HttpRuntime.Cache.سيكون عليك محاكاة IIS بشكل فعال.

من الأفضل استخدام أطر عمل التخزين المؤقت الأخرى مثل:

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top