C# 将类实例关联到asp.net核心中的会话
我目前正在asp.net核心中的Web服务器上工作。 我希望服务器能够处理用户的输入和数据,并且正在寻找一个好的解决方案来为运行时保存复杂的对象 所以我的第一个方法是使用会话。在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字符串。但是在我的例子中,这是不可能的,因为对象
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);
}
}