Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.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# 将类实例关联到asp.net核心中的会话_C#_Asp.net Core_Model View Controller - Fatal编程技术网

C# 将类实例关联到asp.net核心中的会话

C# 将类实例关联到asp.net核心中的会话,c#,asp.net-core,model-view-controller,C#,Asp.net Core,Model View Controller,我目前正在asp.net核心中的Web服务器上工作。 我希望服务器能够处理用户的输入和数据,并且正在寻找一个好的解决方案来为运行时保存复杂的对象 所以我的第一个方法是使用会话。在Asp.net中,会话的工作方式类似于Session[“key”]=newvalueobject() 但是,在asp.net core中,只能使用方法SetString、SetInt32和Set for byte Array。我发现了很多解决方案,基本上将对象转换为Json字符串。但是在我的例子中,这是不可能的,因为对象

我目前正在asp.net核心中的Web服务器上工作。 我希望服务器能够处理用户的输入和数据,并且正在寻找一个好的解决方案来为运行时保存复杂的对象

所以我的第一个方法是使用会话。在Asp.net中,会话的工作方式类似于
Session[“key”]=newvalueobject()

但是,在asp.net core中,只能使用方法SetString、SetInt32和Set for byte Array。我发现了很多解决方案,基本上将对象转换为Json字符串。但是在我的例子中,这是不可能的,因为对象包含其他对象引用和更多

我的第二个想法是创建一个以SessionId为标识符的对象列表。这样做的问题是,每次我向服务器发出请求时,它都需要遍历所有现有会话以找到匹配的会话,因此这可能会大大增加请求的时间

所以我的问题是,保存用户相关对象的最佳方式是什么

使用会话是解决这个问题的最好方法还是我遗漏了什么

注意:请求是由JQuery AJAX处理的,因此重新加载页面以访问数据不是一个选项。

您可以尝试使用可容纳任何.net类型的。这不是一个问题,但鉴于它是一个共享结构,它将共享给所有用户,因此,您必须仔细管理它。为此,可以使用
HttpContext.Session.Id
在内存缓存实例上定义
键。对于示例(我没有测试的伪代码):

公共类HomeController:控制器
{
私有IMemoryCache\u缓存;
公共家庭控制器(IMemoryCache memoryCache)
{
_cache=memoryCache;
}    
公共异步任务CacheGetOrCreateAnchronous()
{
字符串cacheKey=$“{HttpContext.Session.Id}\u data”;
var cacheEntry=wait
_getorCreateAync(cacheKey,条目=>
{
entry.SlidingExpiration=TimeSpan.FromSeconds(3);
返回Task.FromResult(DateTime.Now);
});
返回视图(“缓存”,cacheEntry);
}
}

为什么不能使用JSON?Newtonsoft json完全能够序列化具有多个级别的对象图。此外,您还需要向我们展示您迄今为止在代码方面所做的尝试。这对于ASP.NET Core来说并不新鲜。如果没有在Proc(内存中)中使用,即使在ASP.NET中,在会话中设置对象也会失败。StateServer/SQL Server提供程序将强制您序列化。ASP.NET核心中唯一的区别是,
IDistributedCache
对所有提供程序强制序列化,即使您使用的是
DistributedMemoryCache
(它不是真正分布式的)。
public class HomeController : Controller
{
    private IMemoryCache _cache;

    public HomeController(IMemoryCache memoryCache)
    {
        _cache = memoryCache;
    }    

    public async Task<IActionResult> CacheGetOrCreateAsynchronous()
    {
        string cacheKey = $"{HttpContext.Session.Id}_data";

        var cacheEntry = await
            _cache.GetOrCreateAsync(cacheKey , entry =>
            {
                entry.SlidingExpiration = TimeSpan.FromSeconds(3);
                return Task.FromResult(DateTime.Now);
            });

        return View("Cache", cacheEntry);
    }
}