ASP.NET Webforms和ASP.NET Core之间的会话共享

8nuwlpux  于 12个月前  发布在  .NET
关注(0)|答案(1)|浏览(183)

我有一个旧的ASP.Net Webforms项目,我们正在将其转换为.NET 6.0 Core项目。产品所有者希望能够结合使用这两个项目,直到最终的.NET 6.0项目完成。ASP.Net Webforms项目中有一些项存储在会话状态中,我需要能够从Core项目访问这些项,反之亦然。如何在这些项之间共享会话状态两个应用程序?

w8ntj3qf

w8ntj3qf1#

如果您可以对Web窗体应用程序进行一些小的更改,则预览中有一些包正好可以帮助您解决此问题。System.Web adapter packages旨在使并行运行ASP.NET和ASP.NET核心应用程序变得更容易,同时将功能从ASP.NET应用程序缓慢地移到ASP.NET核心应用程序。
此处适用的功能是shared session
基本上,您需要在这两个应用程序中添加对Microsoft.AspNetCore.SystemWebAdapters.SessionState包的引用(很快将在下一个预览中重命名为Microsoft.AspNetCore.SystemWebAdapters.CoreServicesMicrosoft.AspNetCore.SystemWebAdapters.FrameworkServices)。
完成后,您将在ASP.NET应用程序中添加一个模块,以便它能够安全地使会话信息可供其他应用程序使用(该功能的工作原理是,让ASP.NET核心应用程序服从ASP.NET应用程序来读取或写入会话状态)。

SystemWebAdapterConfiguration.AddSystemWebAdapters(this)
    .AddProxySupport(options => options.UseForwardedHeaders = true)
    .AddRemoteApp(options =>
    {
        options.ApiKey = "<A strong, unique key>";
    })
    .AddRemoteAppSession()
    .AddJsonSessionSerializer(options => 
    {
        // Register session item names/types that will be read or written
        options.KnownKeys.Add("test-value", typeof(int));
        options.KnownKeys.Add("SampleSessionItem", typeof(SessionDemoModel));
    });

字符串
另外,将该模块添加到web.config:

<modules>
  <add name="SystemWebAdapterModule" type="Microsoft.AspNetCore.SystemWebAdapters.SystemWebAdapterModule, Microsoft.AspNetCore.SystemWebAdapters" preCondition="managedHandler" />
</modules>


在ASP.NETCore应用程序中,您将对设置会话服务进行类似的更改,并将它们指向ASP.NET应用程序。
在启动时注册服务时:

builder.Services.AddSystemWebAdapters()
    .AddRemoteApp(options =>
    {
        options.RemoteAppUrl = new("<ASP.NET app's URL>");
        options.ApiKey = "<A strong, unique key>";
    })
    .AddRemoteAppSession()
    .AddJsonSessionSerializer(options =>     {
    {
        // Register session item names/types that will be read or written
        options.KnownKeys.Add("test-value", typeof(int));
        options.KnownKeys.Add("SampleSessionItem", typeof(SessionDemoModel));
    });


另外,在中间件管道中添加System.Web适配器中间件:

app.UseSystemWebAdapters();


作为性能优化,远程会话状态仅在使用[Session]属性进行注解的控制器/操作方法中可用,因此在Map路由时,请根据需要应用该属性,或者使用RequireSystemWebAdapterSession扩展方法全局应用该属性。
完成后,ASP.NETCore应用程序就可以使用与ASP.NET应用程序相同的API访问会话了:

// Read
var model = System.Web.HttpContext.Current?.Session?["SampleSessionItem"] as SessionDemoModel;

// Write
System.Web.HttpContext.Current.Session["SampleSessionItem"] = demoModel;


System.Web adapters GitHub repo中也有一些完整的示例。

相关问题