Как использовать классы как коллекцию списков в Azure AppFabric Caching

Я использую Windows Azure AppFabri Caching. У меня есть два проекта в asp.ne т. Один помещает данные в кеш, а второй читает этот кеш. Эти два проекта работают на 2 разных системах. У меня 4 dll включены в эти проекты.

Microsoft.WindowsFabric.Common.dll
Microsoft.WindowsFabric.Data.Common.dll
Microsoft.ApplicationServer.Caching.Client.dll
Microsoft.ApplicationServer.Caching.Core.dll

Тема 1: Для вставки данных в кеш используется следующий код: Данные успешно сохраняются в кеше

De fault.aspx.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.ApplicationServer.Caching;

public partial class Default2 : System.Web.UI.Page
{
    public class Employee
    {
        public string Name { get; set; }
        public decimal Salary { get; set; }

    }
    protected static DataCacheFactory _factory = null;
    protected static DataCache _cache = null;
    protected void Page_Load(object sender, EventArgs e)
    {
        PutDataIntoCache();

    }
    protected void PutDataIntoCache()
    {
        List<Employee> emp = new List<Employee>();
        try
        {

            emp.Add(new Employee { Name = "James", Salary = 20000 });
            PutCacheItem("55", emp);

        }
        catch (Exception ex)
        {

        }
    }
    protected void PutCacheItem(string key, object value)
    {

        try
        {
            _cache = GetDefaultCache();
            _cache.Put(key, value);
        }
        catch (Exception ex)
        {


        }
    }
    protected static DataCache GetDefaultCache()
    {
        _factory = new DataCacheFactory();
        _cache = _factory.GetDefaultCache();
        return _cache;

    }

}

Сейчас я читаю кеш в другом проекте, который выполняется в другой системе. Код приведен ниже:

De fault.aspx.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.ApplicationServer.Caching;

public partial class Default2 : System.Web.UI.Page
{
    protected static DataCacheFactory _factory = null;
    protected static DataCache _cache = null;
    protected void Page_Load(object sender, EventArgs e)
    {
        GetDataFromCache();

    }
    protected void GetDataFromCache()
    {
        _cache = GetDefaultCache();
        string key = "55";
        var item = _cache.Get(key);// Error is generation here
    }

    protected static DataCache GetDefaultCache()
    {
        _factory = new DataCacheFactory();
        _cache = _factory.GetDefaultCache();
        return _cache;

    }

}

В строке _cache.Get(ключ) генерируется ошибка

The deserializer cannot load the type to deserialize because type 'System.Collections.Generic.List`1[[_Default2+Employee, App_Web_4xzswv4j, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]' could not be found in assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'. Check that the type being serialized has the same contract as the type being deserialized and the same assembly is used.

Почему эта ошибка идет? Как я могу использовать классы в качестве коллекции списков для добавления / чтения в кэше.

2 ответа

Я считаю, что проблема в том, что ваш второй проект не определяет класс Employee. Вы должны действительно определить библиотеку классов с Employee в ней и ссылаться на одну и ту же сборку из обоих проектов.

То, как вы настроили эти проекты, тогда я думаю, что ASP компилирует эти страницы с выделенным кодом во временные сборки - то есть класс Employee определяется как находящийся в сборке. App_Web_4xzswv4j, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null

Вместо этого вы должны поместить эти классы в библиотеку классов, которая может использоваться несколькими проектами - тогда она будет иметь фиксированное имя, а не уникальное имя для каждой компиляции.


Кроме того, я думаю, что вы также должны пометить своего сотрудника как сериализуемого, чтобы обеспечить его сериализацию и десериализацию.

Другие вопросы по тегам