c# - 使用 ASP.NET session 状态服务跨应用程序共享 session

标签 c# asp.net asp.net-mvc session-state

我正在尝试在两个 Web 应用程序之间共享 session ,这两个应用程序都托管在同一台服务器上。一个是 .net 2.0 Web 表单应用程序,另一个是 .net 3.5 MVC2 应用程序。

这两个应用程序的 session 设置如下:

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

在网络表单应用程序中,我将 session key 发布到 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 应用程序中收到它并尝试像这样使用相同的 session :

[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"];

}

正在发布 key ,但 session 似乎没有加载到 MVC 应用程序中,即 sessionKey 为空。我想做的事情可以完成吗?

最佳答案

我是这样做的:

基本上这个想法是两个应用程序都使用存储在 sqlserver 中的 native .net sessionState。通过使用相同的机器 key 并对存储过程进行小的调整——两个应用程序可以共享任何 session key 和/或表单例份验证。

两个应用程序都会在它们的 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 状态数据库需要在数据库服务器上设置,两个应用程序都可以看到。

执行此操作的文档: 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)

关于c# - 使用 ASP.NET session 状态服务跨应用程序共享 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2868316/

相关文章:

asp.net-mvc - 主机名中没有尾部斜杠,HttpResponse.RemoveOutputCacheItem 不起作用

javascript - MVC Controller 返回 JSON 对象日期属性 "changed"到 "Now"

c# - 将大型数据表存储到数据库中的有效方法

c# - Asyncpostback 时 UpdatePanel 中的 SelectPicker 消失

asp.net - 如何在三元运算符中使用 ASP.NET Eval() 函数?

c# - ASP.NET无效的脚本资源请求而不是重定向

asp.net-mvc - ASP.NET MVC+ELMAH - 发生异常时 Controller 方法需要很长时间才能响应

c# - __doPostBack 未定义

c# - 只有一个对象时将 XML 转换为 Json 数组

asp.net - Paypal 退款销售 REST API 返回 : Remote server returned an error: (404) Not Found