gpt4 book ai didi

c# - 使用 asp.net 和状态服务器在两个网站之间共享 session

转载 作者:可可西里 更新时间:2023-11-01 08:08:05 25 4
gpt4 key购买 nike

我在 IIS 7.5 下的两台不同机器上托管了两个完全相同的网站。ASP.NET 状态服务正在我的机器上运行,并且两个站点中的 web.config 都使用以下代码更新:

<sessionState mode="StateServer" stateConnectionString="tcpip=192.168.1.77:42424" cookieless="false" timeout="120"/>

允许远程连接在注册表中设置为 1,以便第二个网站访问状态服务器。

两个网站都有相同的机器 key :

<machineKey validationKey="7CB8DF6872FB6B35DECD3A8F55582350FEE1FAB9BE6B930216056C1B5BA69A4C5777B3125A42C4AECB4419D43EC12F168FD1BB887469798093C3CAA2427B2B89" decryptionKey="02FC52E4C71544868EE297826A613C53537DF8FDAF93FA2C64E9A5EF0BA467FB" validation="SHA1" decryption="AES" />

此外,两个站点都在 IIS 中配置为具有相同的标识符。

我想做的是这两个站点共享相同的 session 数据,例如能够执行以下操作:

// At web site 1: 
Session["key"] = "value"

// At web site 2:
// Read session value from the other web site
string result = Session["key"]

问题是我无法完成这个测试,真的不明白我做错了什么。

有什么可能有用的想法吗?

最佳答案

我知道这个问题在 5 年前就得到了回答,但今天我想我可以在其中添加更多信息。

首先,这不是在 2 个 IIS 应用程序之间共享 session 数据的官方方式,也不是最流行的方式。 “看似官方”的方式是use SQL Server session .

如果您出于任何原因不能使用 SQL 服务器,那么我们可以稍微调整 IIS 应用程序,以便我们可以使用进程外 session ,也就是 StateServer session 状态模式。

要使其正常工作,需要做很多事情:

  1. 2 个应用程序的 session cookie 必须设置为相同的域名。例如
<httpCookies domain=".your.site"/>
  1. 机器 key 必须匹配。你可以做标准Web.config field encryption使其更安全,但这是可选的。
<machineKey validationKey="[your_key]" 
decryptionKey="[your_decryption_key]" validation="SHA1" />
  1. session 状态模式设置为状态服务器

将 (1)、(2)、(3) 放在一起:

<system.web>
<httpCookies domain=".your.site"/>
<machineKey validationKey="your_key" decryptionKey="your_decryption_key" validation="SHA1" />
<sessionState mode="StateServer" timeout="60" />
...
  1. 应用名称必须匹配。如果不是,则只能共享 session ID,而不能共享 session 数据。问题是您不能在 Web.config 中配置您的应用程序名称。然而,我们可以创建自己的配置,然后通过反射注入(inject)它。只需将以下代码放在 Global.asax.cs 中:

    public override void Init()
    {
    base.Init();
    try
    {
    // Get the app name from config file...
    string appName = ConfigurationManager.AppSettings["ApplicationName"];
    if (!string.IsNullOrEmpty(appName))
    {
    foreach (string moduleName in this.Modules)
    {
    IHttpModule module = this.Modules[moduleName];
    SessionStateModule ssm = module as SessionStateModule;
    if (ssm != null)
    {
    FieldInfo storeInfo = typeof(SessionStateModule).GetField("_store", BindingFlags.Instance | BindingFlags.NonPublic);
    SessionStateStoreProviderBase store = (SessionStateStoreProviderBase)storeInfo.GetValue(ssm);
    if (store == null) //In IIS7 Integrated mode, module.Init() is called later
    {
    FieldInfo runtimeInfo = typeof(HttpRuntime).GetField("_theRuntime", BindingFlags.Static | BindingFlags.NonPublic);
    HttpRuntime theRuntime = (HttpRuntime)runtimeInfo.GetValue(null);
    FieldInfo appNameInfo = typeof(HttpRuntime).GetField("_appDomainAppId", BindingFlags.Instance | BindingFlags.NonPublic);
    appNameInfo.SetValue(theRuntime, appName);
    }
    else
    {
    Type storeType = store.GetType();
    if (storeType.Name.Equals("OutOfProcSessionStateStore"))
    {
    FieldInfo uribaseInfo = storeType.GetField("s_uribase", BindingFlags.Static | BindingFlags.NonPublic);
    uribaseInfo.SetValue(storeType, appName);
    }
    }
    }
    }
    }

    }
    catch (Exception ex)
    {
    log.Error(ex.Message, ex);
    }
    }

    学分转到pfemiani , Li Chen ,还有一个我不记得是谁把它放在代码项目评论中的人。请注意,pfemiani 的回答对我不起作用,但将其与 Li Chen 的帖子结合起来就可以了。

  2. 确保ASP .NET state service在跑。这是现在保存 session 数据的地方。

关于c# - 使用 asp.net 和状态服务器在两个网站之间共享 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3438912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com