Как использовать классы как коллекцию списков в 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
Вместо этого вы должны поместить эти классы в библиотеку классов, которая может использоваться несколькими проектами - тогда она будет иметь фиксированное имя, а не уникальное имя для каждой компиляции.
Кроме того, я думаю, что вы также должны пометить своего сотрудника как сериализуемого, чтобы обеспечить его сериализацию и десериализацию.