我想利用新的Windows Azure缓存服务(预览),并且能够通过跟随this article使用Session成功存储和检索缓存中的内容。不幸的是我们将Linq存储到Session中的Sql对象,此时我们无法改变它。尝试使用Azure缓存服务在Session中存储此类对象时,出现以下错误:
类型'System.Data.Linq.EntitySet`1 [cachetest.Child]'无法序列化。请考虑使用DataContractAttribute属性对其进行标记,并使用DataMemberAttribute属性标记要序列化的所有成员。如果类型是集合,请考虑使用CollectionDataContractAttribute标记它。
我对我的数据上下文使用了“单向”序列化模式,因此所有声明都已使用“DataContract”和“DataMember”属性进行修饰(请参阅下面的代码示例)。
我已尝试使用自定义序列化工具similar to this article和this article on stackoverflow,但收到的错误与最终of this article所描述的确切错误相符,其中声明< / p>
用于缓存的ASP.NET提供程序不支持二进制或自定义序列化类型
由于自定义序列化程序不是一个选项,我怎样才能在使用Windows Azure缓存的Session中将Linq存储到Sql对象(具有父子关系)?
我已经打破了解释下面问题的代码 Linq DataContext:
<?xml version="1.0" encoding="utf-8"?><Database Class="TestModelDataContext" Serialization="Unidirectional" xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007">
<Table Name="" Member="Parents">
<Type Name="Parent">
<Column Member="Name" Type="System.String" CanBeNull="false" />
<Column Member="ParentId" Type="System.Int32" IsPrimaryKey="true" CanBeNull="false" />
<Association Name="Parent_Child" Member="Childs" ThisKey="ParentId" OtherKey="ParentId" Type="Child" />
</Type>
</Table>
<Table Name="" Member="Childs">
<Type Name="Child">
<Column Member="Name" Type="System.String" CanBeNull="false" />
<Column Member="ChildId" Type="System.Int32" IsPrimaryKey="true" CanBeNull="false" />
<Column Member="ParentId" Type="System.Int32" CanBeNull="false" />
<Association Name="Parent_Child" Member="Parent" ThisKey="ParentId" OtherKey="ParentId" Type="Parent" IsForeignKey="true" />
</Type>
</Table>
</Database>
使用会话的页面:
namespace cachetest
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Parent newParent = new Parent { Name = "John", ParentId=1 };
Child child1 = new Child { ChildId = 1, Name="John Jr." };
Child child2 = new Child { ChildId = 2, Name="Betty" };
newParent.Childs.Add(child1);
newParent.Childs.Add(child2);
Session["parent"] = newParent;
}
}
}
Web.Config(已删除敏感数据):
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="dataCacheClients" type="Microsoft.ApplicationServer.Caching.DataCacheClientsSection, Microsoft.ApplicationServer.Caching.Core" allowLocation="true" allowDefinition="Everywhere"/>
<section name="cacheDiagnostics" type="Microsoft.ApplicationServer.Caching.AzureCommon.DiagnosticsConfigurationSection, Microsoft.ApplicationServer.Caching.AzureCommon" allowLocation="true" allowDefinition="Everywhere"/>
</configSections>
<connectionStrings>
</connectionStrings>
<system.web>
<compilation debug="true" targetFramework="4.5"/>
<httpRuntime/>
<sessionState mode="Custom" customProvider="AFCacheSessionStateProvider">
<providers>
<add name="AFCacheSessionStateProvider" type="Microsoft.Web.DistributedCache.DistributedCacheSessionStateStoreProvider, Microsoft.Web.DistributedCache" cacheName="default" dataCacheClientName="default" applicationName="AFCacheSessionState"/>
</providers>
</sessionState>
<pages controlRenderingCompatibilityVersion="4.0"/>
</system.web>
<dataCacheClients>
<dataCacheClient name="default">
<autoDiscover isEnabled="true" identifier="[cachename].cache.windows.net"/>
<securityProperties mode="Message" sslEnabled="false">
<messageSecurity authorizationInfo="[CacheKey]"/>
</securityProperties>
</dataCacheClient>
</dataCacheClients>
</configuration>
答案 0 :(得分:0)
经过更多研究后,我无法找到在使用Windows Azure缓存服务时将Linq存储到会话中的Sql对象的方法。我遇到了与基于SQL Server的会话状态等其他进程外会话机制相同的问题。对我来说最好的解决方案是使用类似于the one in this article的SessionHelper对象。我将页面加载中的对象存储到会话中的行更改为:
SessionHelper.Set("Parent", newParent);
最后,我的问题与Windows Azure缓存没有特别关系,但与this article on stackoverflow非常相似