我有一个旧的ASP.Net Webforms项目,我们正在将其转换为.NET 6.0 Core项目。产品所有者希望能够结合使用这两个项目,直到最终的.NET 6.0项目完成。ASP.Net Webforms项目中有一些项存储在会话状态中,我需要能够从Core项目访问这些项,反之亦然。如何在这些项之间共享会话状态两个应用程序?
w8ntj3qf1#
如果您可以对Web窗体应用程序进行一些小的更改,则预览中有一些包正好可以帮助您解决此问题。System.Web adapter packages旨在使并行运行ASP.NET和ASP.NET核心应用程序变得更容易,同时将功能从ASP.NET应用程序缓慢地移到ASP.NET核心应用程序。此处适用的功能是shared session。基本上,您需要在这两个应用程序中添加对Microsoft.AspNetCore.SystemWebAdapters.SessionState包的引用(很快将在下一个预览中重命名为Microsoft.AspNetCore.SystemWebAdapters.CoreServices和Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices)。完成后,您将在ASP.NET应用程序中添加一个模块,以便它能够安全地使会话信息可供其他应用程序使用(该功能的工作原理是,让ASP.NET核心应用程序服从ASP.NET应用程序来读取或写入会话状态)。
Microsoft.AspNetCore.SystemWebAdapters.SessionState
Microsoft.AspNetCore.SystemWebAdapters.CoreServices
Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices
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访问会话了:
[Session]
RequireSystemWebAdapterSession
// Read var model = System.Web.HttpContext.Current?.Session?["SampleSessionItem"] as SessionDemoModel; // Write System.Web.HttpContext.Current.Session["SampleSessionItem"] = demoModel;
型在System.Web adapters GitHub repo中也有一些完整的示例。
1条答案
按热度按时间w8ntj3qf1#
如果您可以对Web窗体应用程序进行一些小的更改,则预览中有一些包正好可以帮助您解决此问题。System.Web adapter packages旨在使并行运行ASP.NET和ASP.NET核心应用程序变得更容易,同时将功能从ASP.NET应用程序缓慢地移到ASP.NET核心应用程序。
此处适用的功能是shared session。
基本上,您需要在这两个应用程序中添加对
Microsoft.AspNetCore.SystemWebAdapters.SessionState
包的引用(很快将在下一个预览中重命名为Microsoft.AspNetCore.SystemWebAdapters.CoreServices
和Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices
)。完成后,您将在ASP.NET应用程序中添加一个模块,以便它能够安全地使会话信息可供其他应用程序使用(该功能的工作原理是,让ASP.NET核心应用程序服从ASP.NET应用程序来读取或写入会话状态)。
字符串
另外,将该模块添加到web.config:
型
在ASP.NETCore应用程序中,您将对设置会话服务进行类似的更改,并将它们指向ASP.NET应用程序。
在启动时注册服务时:
型
另外,在中间件管道中添加System.Web适配器中间件:
型
作为性能优化,远程会话状态仅在使用
[Session]
属性进行注解的控制器/操作方法中可用,因此在Map路由时,请根据需要应用该属性,或者使用RequireSystemWebAdapterSession
扩展方法全局应用该属性。完成后,ASP.NETCore应用程序就可以使用与ASP.NET应用程序相同的API访问会话了:
型
在System.Web adapters GitHub repo中也有一些完整的示例。