将类实例与asp.net核心中的会话相关联

时间:2019-10-28 15:21:43

标签: c# asp.net-core model-view-controller

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

所以我的第一种方法是使用Sessions。在Asp.net中,会话曾经像Session["key"] = new ValueObject()

一样工作

但是,在asp.net核心中,只能将SetString,SetInt32和Set方法用于字节数组。我发现了很多解决方案,它们基本上将对象转换为Json字符串。但是,在我的情况下,由于对象包含其他对象引用和更多对象,因此这是不可能的。

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

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

使用Session甚至是解决此问题的最佳方法还是我错过了什么?

注意:请求由JQuery AJAX处理,因此不能重新加载页面以访问数据。

1 个答案:

答案 0 :(得分:1)

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

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);
    }
}