Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 会话作为参考.net内核_C#_Session_.net Core - Fatal编程技术网

C# 会话作为参考.net内核

C# 会话作为参考.net内核,c#,session,.net-core,C#,Session,.net Core,我是.NETCore的新手。 我在.NETCore中使用session,但我发现当我使用复杂对象时,我必须序列化/反序列化对象,然后保存在session中 这意味着,当我从会话加载一个复杂对象时,每次在页面状态结束时,我都必须在会话中序列化并保存该对象 只有当对象被修改时,才有一个技巧来序列化/保存对象 (我的意思是,在asp.net中,会话保存/加载是自动的,在.net core中有类似的作业吗?) 谢谢大家。我不确定这种技巧,但您可以引入一些扩展方法来接受类型化参数以进行缓存值设置/检索 一

我是.NETCore的新手。 我在.NETCore中使用session,但我发现当我使用复杂对象时,我必须序列化/反序列化对象,然后保存在session中

这意味着,当我从会话加载一个复杂对象时,每次在页面状态结束时,我都必须在会话中序列化并保存该对象

只有当对象被修改时,才有一个技巧来序列化/保存对象

(我的意思是,在asp.net中,会话保存/加载是自动的,在.net core中有类似的作业吗?)


谢谢大家。

我不确定这种技巧,但您可以引入一些扩展方法来接受类型化参数以进行缓存值设置/检索

一个可能的实现选项是将要缓存的对象序列化为JSON,然后缓存它的UTF8表示。使用可以序列化具有所有必需依赖项的整个对象层次结构,以便在反序列化时恢复整个层次结构

public static class TypedSessionValuesExtensions
{
    public static void Set<T>(this ISession session, string key, T value)
    {
        var json = JsonConvert.SerializeObject(value,
            new JsonSerializerSettings {
                PreserveReferencesHandling = PreserveReferencesHandling.All
            });
        var bytes = Encoding.UTF8.GetBytes(json);
        session.Set(key, bytes);
    }

    public static bool TryGetValue<T>(this ISession session, string key, out T value)
    {
        byte[] bytes;
        if (!session.TryGetValue(key, out bytes))
        {
            value = default(T);
            return false;
        }
        try
        {
            var json = Encoding.UTF8.GetString(bytes);
            value = JsonConvert.DeserializeObject<T>(json);
            return true;
        }
        catch
        {
            value = default(T);
            return false;
        }
    }
}
公共静态类TypedSessionValuesException
{
公共静态无效集(此ISession会话,字符串键,T值)
{
var json=JsonConvert.SerializeObject(值,
新JsonSerializerSettings{
PreserveReferencesHandling=PreserveReferencesHandling.All
});
var bytes=Encoding.UTF8.GetBytes(json);
session.Set(键,字节);
}
公共静态bool TryGetValue(此ISession会话,字符串键,out T值)
{
字节[]字节;
if(!session.TryGetValue(键,输出字节))
{
值=默认值(T);
返回false;
}
尝试
{
var json=Encoding.UTF8.GetString(字节);
value=JsonConvert.DeserializeObject(json);
返回true;
}
抓住
{
值=默认值(T);
返回false;
}
}
}

请注意,在复杂层次结构和引用相同对象的不同缓存值的情况下,这种方法可能会增加不必要的开销和反序列化对象复制。在这种情况下,您可以使用更适合对象层次结构的序列化方法实现
Set()
TryGetValue()
扩展。

对不起,这并不意味着每次都必须在页面状态结束时保存所有对象?