我刚刚从 .NET Core 2.2 升级到 3.1。我进行了测试以确认我添加的扩展方法HttpContext.Request正在工作。我以前能够做这样的事情:
var context = new DefaultHttpContext();
var c = new Dictionary<string, string> {{"test", "passed"}};
context.Request.Cookies = new RequestCookieCollection(cookies);
var result = context.Request.GetPrimedValue();
Run Code Online (Sandbox Code Playgroud)
现在这不可能了吗?我尝试为此使用 Moq,但似乎有太多东西阻止我使用任何可用的东西来设置 Cookies 属性。对此有何决议?
注意:我知道这是使用一个不应该是内部的内部类,所以我不反对隐藏内部命名空间,但我不确定我的替代方案是什么。
对于EF6,我在我的通用存储库中有一个方法,我将其暴露给所有服务层,以便根据需要使用任何嵌套属性从数据库中检索实体:
public IQueryable<T> OldMethod(params Expression<Func<T, object>>[] includeProperties)
{
var queryable = set.AsQueryable();
return includeProperties.Aggregate(queryable, (current, includeProperty) => current.Include(includeProperty));
}
Run Code Online (Sandbox Code Playgroud)
这样,我可以通过以下方式使用该方法:
var data = repo.OldMethod(x => x.Papers, => x.People.Select(y => y.Addresses)).ToList();
Run Code Online (Sandbox Code Playgroud)
在EF6中,这将加载每个人的Papers导航属性,People导航属性和Addresses导航属性.正如预期的那样,这会在EFCore中引发异常.由于在EFCore中切换到Include - > ThenInclude方法,我不太清楚如何在我的服务层轻松复制它,我不想要任何有关EntityFramework的信息.
在启动类中,我使用以下代码启用会话存储:
services.AddDistributedMemoryCache()
.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(20);
options.Cookie.HttpOnly = true;
})
Run Code Online (Sandbox Code Playgroud)
但是,如果我正确理解这一点,则设置该IdleTimeout属性仅表示如果用户在20分钟内未完成任何操作,会话将重新开始。我的应用程序具有轮询功能,它每5-10秒使用一次会话存储中的用户信息,因此我认为这在这里永远不会有用。用户权限和角色可以从当前用户浏览器之外执行的操作中更改,因此我想将会话存储限制为1分钟。我似乎找不到关于默认到期时间或如何正确设置的确切说法。
CookieBuilder类具有Expiration和MaxAge选项,但我不知道哪个是必需的。我还阅读了Expiration被忽略的信息,这使我对该主题的困惑更加严重。
更新:当我尝试设置过期时间时,我收到此消息:“无法为SessionOption定义的cookie设置过期时间”,因此我将MaxAge设置为1分钟,但是我可以看到该会话中仍然有旧的用户数据超过1分钟后。