使用ASP.NET会话状态服务跨应用程序共享会话

我试图在两个Web应用程序之间共享会话,这两个应用程序都托pipe在同一台服务器上 一个是.net 2.0 web表单应用程序,另一个是.net 3.5 MVC2应用程序。

这两个应用程序的会话都是这样设置的:

<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" /> 

在webform应用程序中,我将会话密钥发布到MVC应用程序中:

 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应用程序中收到它,并尝试使用像这样的相同的会话:

 [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为空。 我可以做什么?

我这样做了:

基本上这个想法是两个应用程序使用原生.net会话状态存储在sqlserver。 通过使用相同的机器密钥,并对存储过程进行小小的调整 – 两个应用程序都可以共享任何会话密钥和/或表单authentication。

这两个应用程序会在他们的web.config中做这样的事情:

 <sessionState mode="SQLServer" sqlConnectionString="Data Source=.\SQLEXPRESS;User Id=test;Password=test;Application Name=AppName" /> <machineKey validationKey="SOMEKEY" validation="SHA1" decryption="AES" /> 

会话状态数据库将需要在数据库服务器上设置,这两个应用程序都可以看到。

这样做的文档: http : //msdn.microsoft.com/en-us/library/ms229862(VS.80).aspx

需要运行的命令:C:\ Program Files(x86)\ Microsoft Visual Studio 9.0 \ VC \ bin> aspnet_regsql.exe -E -ssadd –sstype p -S。\ SQLEXPRESS

存储过程(TempGetAppID)调整为:

  @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) 

问题是会话密钥的作用域是应用程序,所以具有相同会话密钥的两个应用程序实际上有单独的会话。

你可以做两件事之一:

  1. 把这两个应用程序作为一个虚拟目录下的一个共同的IIS应用 我不认为这是一个好主意,但它会起作用。

  2. 为您要共享的数据滚动您自己的会话数据解决scheme。 可能使用后端数据库作为公共存储,如果有的话。

基于贾斯汀的评论,只是为了澄清选项2没有引用进程会话的SQL状态pipe理。 我的意思是实际上手动pipe理两个会话的共享数据,可能使用数据库。