2017-05-31 231 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進行緩存嗎? –