我试图在两个Web应用程序之间共享会话,这两个Web应用程序都托管在同一服务器上。一个是.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为null。我可以做的事情可以做吗?
我这样做是这样的:
基本上,这两个应用程序都使用存储在sqlserver中的本机.net sessionState。通过使用相同的机器密钥并对存储过程进行细微调整,两个应用程序可以共享任何会话密钥和/或表单身份验证。
这两个应用程序都将在其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/zh- cn/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)