使用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)
问题是会话密钥的作用域是应用程序,所以具有相同会话密钥的两个应用程序实际上有单独的会话。
你可以做两件事之一:
-
把这两个应用程序作为一个虚拟目录下的一个共同的IIS应用 我不认为这是一个好主意,但它会起作用。
-
为您要共享的数据滚动您自己的会话数据解决scheme。 可能使用后端数据库作为公共存储,如果有的话。
基于贾斯汀的评论,只是为了澄清选项2没有引用进程会话的SQL状态pipe理。 我的意思是实际上手动pipe理两个会话的共享数据,可能使用数据库。