Кэширование в приложении WCF - PullRequest
1 голос
/ 12 июля 2011

Приведенный ниже код выдает ошибку "Object reference not set to an instance of an object" при вызове mycache.Get ("products"). Я использую приложение WCF. Я не на 100% использую кеширование правильно. Любой совет?

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

    } }

РЕДАКТИРОВАТЬ : я использую .net 3.5

Ответы [ 4 ]

2 голосов
/ 12 июля 2011

Я не уверен, что не так с вашим кодом, потому что я не знаю, как реализовать Cache, но небольшой поиск обнаружил следующее пошаговое руководство от MSDN:

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

Кэширование данных приложения в приложении WPF

И следующая ссылка дает обзор:

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

Таким образом, получается, что для.NET v4 и выше, кэширование перенесено в System.Runtime.Caching с System.Web.Caching.

1 голос
/ 12 июля 2011

Судя по документации, вы не должны создавать свой собственный экземпляр класса Cache (он говорит, что конструктор предназначен только для фреймворка). Попробуйте использовать Cache.Get вместо?

РЕДАКТИРОВАТЬ (в ответ на комментарий) ...

Из документов MSDN здесь :

Один экземпляр этого класса создается для домена приложения, и он остается действительным, пока домен приложения остается активным. Информация об экземпляре этого класса доступна через свойство Cache объекта HttpContext или свойство Cache объекта Page.

Итак, похоже, что Cache.Get доступно, когда вы находитесь на странице; в противном случае вы можете позвонить HttpContext.Cache, чтобы получить активный кеш. В любом случае, для вашего приложения есть один Cache объект, и вы определенно не должны создавать свой собственный.

0 голосов
/ 12 июля 2011

Если я что-то не упустил, вы пытаетесь использовать кеш ASP .NET в вашей службе WCF. Чтобы это работало, необходимо включить совместимость ASP .NET с помощью перечисления AspNetCompatibilityRequirementsMode . Если вы используете хостинг самостоятельно, вам придется кататься самостоятельно.

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

}
0 голосов
/ 12 июля 2011

Для приложений, не относящихся к ASP.NET, используйте кэширование из System.Runtime.Caching .

Ваш код выдает System.NullReferenceException, поскольку внутренний кэш CacheInternal из System.Web.Caching.Cache не инициализированиспользуя internal void SetCacheInternal(CacheInternal cacheInternal) метод.Он инициализируется инфраструктурой ASP.NET в System.Web.HttpRuntime классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...