2017-05-31 235 views
0

我有一个在Azure App Service上托管的ASP.Net应用程序。Azure Redis缓存序列化

我知道默认的“InProc”会话缓存在Azure中不起作用。

一直在寻找解决办法,和整个Redis的来了,这是我在Azure中启用并设定按照配置文件

<sessionState mode="Custom" customProvider="RedisStateStore"> 
    <providers> 
    <add name="RedisStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider" 
     host="xxx.redis.cache.windows.net:6380" accessKey="xxx=" ssl="true" 
     redisSerializerType="MyApp.Net.Helper.JsonSerializer,MyApp.Net" 
     /> 
    </providers> 
</sessionState></system.web> 

默认情况下,我开始总成没有序列号错误一些形式。由于我使用了50个表格,所以不确定哪一个是序列化的,而且它变得单调乏味。

因此启用自定义处理程序处理程序在这里:

public class JsonSerializer : Microsoft.Web.Redis.ISerializer 
{ 
    private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All, 
     ReferenceLoopHandling = ReferenceLoopHandling.Ignore, PreserveReferencesHandling = PreserveReferencesHandling.Objects, 
    Error = (serializer, err) => { 
     err.ErrorContext.Handled = true; 
    } 
    }; 

public byte[] Serialize(object data) 
    { 
     return Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(data, Settings)); 
    } 

    public object Deserialize(byte[] data) 
    { 
     return data == null ? null : JsonConvert.DeserializeObject(Encoding.UTF8.GetString(data), Settings); 
    } 
} 

但是,这就像每个序列化对象那里,我觉得它实际上拖慢系统进一步。然后将其失败的一些对象数组,像following

如果我忽略了像上面的代码(我知道是不好的做法)的错误,有时我遇到的System.OutOfMemoryException例外。

任何意见在这里感激。

+0

''我开始为某些窗体获取程序集而不是序列化错误。'您是否检查过哪个程序集未标记为可序列化? –

+0

@ FredHan-MSFT - 是的,这些是我的数据模型。像产品,客户等 –

+0

仍在寻找答案 –

回答

0

我开始组装不序列化错误某些形式

当使用Session State Provider for Redis,我们应该确保被存储在会话状态的数据类型是序列化的。

而且据我所知,错误信息应该指出哪个组件没有标记为可序列化的类型,这应该有助于我们快速找到具体的类型不能从后面的代码序列化。

这就像序列化每个对象那里,我觉得它实际上进一步减慢了系统。然后将其失败的一些对象数组

你可以找到基于错误的详细信息Type 'xxx' in Assembly 'xxx, Version=...' is not marked as serializable您在网页查看特定类型/对象,并试图为只有这些类型/对象做序列化。此外,如果可能的话,您可以使用NonSerializedAttribute来查看对象的某些字段。

+0

是的,错误定义了未标记的对象,但它只是单调乏味地运行测试脚本/调试来识别对象列表。 我宁愿所有对象在默认情况下都不会被序列化,我会根据需要选择要序列化的内容。 我们不能只尝试先用DOM进行缓存吗? –