使用 ASP.NET 会话状态服务跨应用程序共享会话 [英] Sharing sessions across applications using the ASP.NET Session State Service
问题描述
我正在尝试在托管在同一台服务器上的两个 Web 应用程序之间共享会话.一个是 .net 2.0 Web 表单应用程序,另一个是 .net 3.5 MVC2 应用程序.
I am trying to share sessions between two web applications, both hosted on the same server. One is a .net 2.0 web forms application the other is as .net 3.5 MVC2 application.
两个应用程序的会话设置如下:
Both apps have their session set up like this:
<sessionState
mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
/>
在 webform 应用程序中,我将会话密钥发布到 MVC 应用程序:
In the webform application I am posting the the session key to the MVC app:
protected void LinkButton1_Click(object sender, EventArgs e)
{
Session["myvariable"] = "dan";
string sessionKey = HttpContext.Current.Session.SessionID;
//Followed by some code that posts sessionKey to the other application
}
然后我在 MVC 应用程序中收到它并尝试使用相同的会话:
I then recieve it in the MVC application and try use the same session like this:
[HttpPost]
public void Recieve(string sessionKey )
{
var manager = new SessionIDManager();
bool redirected;
bool IsAdded;
manager.SaveSessionID(HttpContext.ApplicationInstance.Context, Id, out redirected, out IsAdded);
var myVar = Session["myvariable"];
}
密钥正在发布,但会话似乎没有加载到 MVC 应用程序中,即 sessionKey 为空.我正在尝试做的事情可以完成吗?
The key is being posted but the session does not seem to get loaded in the MVC app, i.e. sessionKey is null. Can what I am trying to do be done?
推荐答案
我是这样做的:
基本上这个想法是两个应用程序都使用存储在 sqlserver 中的本机 .net sessionState.通过使用相同的机器密钥并对存储过程进行小幅调整 - 这两个应用程序可以共享任何会话密钥和/或表单身份验证.
Basically the idea is both apps use native .net sessionState stored in sqlserver. By using the same machine key and making a small tweak to a stored procedure – both apps can share any session keys and/or forms authenication.
两个应用程序都会在它们的 web.config 中做这样的事情:
Both apps would do something like this in their web.config:
<sessionState mode="SQLServer" sqlConnectionString="Data Source=.SQLEXPRESS;User Id=test;Password=test;Application Name=AppName" />
<machineKey
validationKey="SOMEKEY"
validation="SHA1" decryption="AES"
/>
会话状态数据库需要在数据库服务器上设置,两个应用程序都可以看到.
Session state db would need to be set up on a database server, that both apps can see.
执行此操作的文档:http://msdn.microsoft.com/en-us/图书馆/ms229862(VS.80).aspx
需要运行的命令:C:Program Files (x86)Microsoft Visual Studio 9.0VCin>aspnet_regsql.exe -E -ssadd --sstype p -S .SQLEXPRESS
Command that would need to be run: C:Program Files (x86)Microsoft Visual Studio 9.0VCin>aspnet_regsql.exe -E -ssadd --sstype p -S .SQLEXPRESS
存储过程 (TempGetAppID) 调整为:
Stored procedure (TempGetAppID) tweak to:
@appId int OUTPUT
AS
-- start change
-- Use the application name specified in the connection for the appname if specified
-- This allows us to share session between sites just by making sure they have the
-- the same application name in the connection string.
DECLARE @connStrAppName nvarchar(50)
SET @connStrAppName = APP_NAME()
-- .NET SQLClient Data Provider is the default application name for .NET apps
IF (@connStrAppName <> '.NET SQLClient Data Provider')
SET @appName = @connStrAppName
-- end change
SET @appName = LOWER(@appName)
这篇关于使用 ASP.NET 会话状态服务跨应用程序共享会话的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!