Asp.Net 核心 2.0 会话销毁了每个构建



我来自PHP生态系统,现在我想将我的技能升级到Core 2.0 Asp.Net。会话存在问题,因为这些会话将在每次构建时被销毁,这在开发过程中真的很烦人。

Asp.net 身份验证系统不会在生成/重新启动时销毁,而会话会销毁。

有一种方法可以使会话像身份验证行为一样持久?

我的解决方法是;由于我使用的是 asp.net 身份验证,我可以存储一个唯一的 id 并从数据库加载会话(包含自定义对象(。然后在更改时再次保存它...

注意:我的应用程序是多用户的,因此我需要在每次请求数据库时引用会话中的用户 ID 以选择相关数据。

ASP.NET 会话从不与身份验证相关。它们使用自己的存储来存储单个用户会话期间使用的临时数据。

在 ASP.NET 核心中,会话中间件始终使用为 IDistributedCache 注册的服务。默认实现是本地内存缓存:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    // Adds a default in-memory implementation of IDistributedCache.
    services.AddDistributedMemoryCache();
    services.AddSession(options =>
    {
        // Set a short timeout for easy testing.
        options.IdleTimeout = TimeSpan.FromSeconds(10);
        options.Cookie.HttpOnly = true;
    });
}

有两个持久存储提供程序,一个用于 Redis,一个用于 SQL Server。要使用它们,只需替换对AddDistributedMemoryCache()的调用,例如:

services.AddDistributedSqlServerCache(options =>
{
    options.ConnectionString = @"Data Source=(localdb)v11.0;Initial Catalog=DistCache;Integrated Security=True;";
    options.SchemaName = "dbo";
    options.TableName = "TestCache";
});

链接的文档页面说明了如何配置提供程序。

所有三个提供程序都可以在 ASP.NET\Caching 存储库中找到。您可以使用它们作为实现自己的提供程序的起点,例如使用 MySQL,假设还没有可用的提供程序。

您还可以将 ASP.NET Core配置为使用内存中缓存进行常规缓存,将SQL Server或Redis用于分布式缓存和会话存储,例如:

services.AddMemoryCache();
services.AddDistributedRedisCache(options =>
{
    options.Configuration = "localhost";
    options.InstanceName = "SampleInstance";
});

默认会话存储位于内存中,主要是因为每种其他类型的存储都需要某种类型的配置。当您拥有存储在内存中的任何内容(会话、缓存等(时,它本质上是进程绑定的,因此当进程终止时,存储在内存中的所有内容都会随之而来。重新生成正在运行的 Web 应用会导致进程终止并重新启动,因此简而言之,这就是您的问题。

如果您希望会话持久化,则需要使用持久存储.SQL即服务器、Redis 等。ASP.NET Core 分布式缓存(这是 ASP.NET Core 用于会话的缓存(文档介绍了如何设置所有这些缓存。

最新更新