在 ASP.NET Core 3.1 中创建会话

sm1*_*101 3 c# session .net-core asp.net-core

我正在使用 ASP.NET Core 3.1。我需要在控制器的操作中设置会话。我在 ConfigureServices() 方法中添加了会话:

services.AddSession(options => {
                options.IdleTimeout = System.TimeSpan.FromSeconds(3600);
            });
Run Code Online (Sandbox Code Playgroud)

我还添加了在 Configure() 方法中使用 session 的代码:

app.UseSession();
Run Code Online (Sandbox Code Playgroud)

在控制器类中,我试图创建一个会话

HttpContext.Session.Set("sessionuser",xxx);
Run Code Online (Sandbox Code Playgroud)

所需的 xxx 是一个 byte[],与 .NET CORE 2.2 中 SetString() 所需的字符串不同,如何为此创建 byte[]?在创建会话中有其他更好的选择吗?

Chr*_*att 9

GetString/SetString仍然存在于 .NET Core 3.1 中。它们是扩展(一如既往)并存在于Microsoft.AspNetCore.Http命名空间中。也许您只需要添加一个using?

您没有在这里提供大量有关您的情况的信息,但您可能正在从类库中执行此操作。在这种情况下,事情变得有点棘手。ASP.NET Core 3.X 转向对大部分 ASP.NET Core 代码使用框架引用(而不是对Microsoft.AspNetCore.App元包的包引用。但是,该框架引用只能在定位netcoreapp3.0或更高版本时使用。如果您重新针对 .NET Standard,您只能引用旧的 2.X 包。

如果您只支持 ASP.NET Core 3.X 应用程序,那么您只需将类库的目标更改为netcoreapp3.1并添加框架引用。如果您还需要支持 ASP.NET Core 2.X 应用程序,那么您必须将类库同时针对netcoreapp3.1netstandard2.0,并在项目文件中使用条件来添加框架引用或单独的 2.X 包取决于目标。Andrew Lock 有一个很好的指南和更多信息:https : //andrewlock.net/converting-a-netstandard-2-library-to-netcore-3/

还值得一提的是,System.Text.Json支持直接序列化 to/from byte[]。因此,如果您已经在使用或打算使用泛型类型扩展ISession来支持比简单字符串或可以强制为字符串的值类型更复杂的类型,那么您可以只依赖它:

public static class SessionExtensions
{
    public static void Set<T>(this ISession session, string key, T value)
    {
        session.Set(key, JsonSerializer.SerializeToUtf8Bytes(value));
    }

    public static T Get<T>(this ISession session, string key)
    {
        var value = session.Get(key);

        return value == null ? default(T) : 
            JsonSerializer.Deserialize<T>(value);
    }
}
Run Code Online (Sandbox Code Playgroud)