0

根据我们当前的设置,需要在两个站点之间维护镜像会话,一个托管在 IIS 6.0 中的现有 ASP.NET 网站,现在将新网站包含在 iFrame 中,并单独托管在 IIS 7.5(它是 MVC3)中。

有人对如何使父会话与子网站会话保持一致有任何建议吗?

我最初的想法是创建一个 ActionFilter 以在 OnActionExecuting 方法上向父站点上的各种 HTTPHandler 触发 HttpWebRequest。有人怀疑这将如何保持特定会话内联,可能缺少关于会话 ID 的各种知识?

就像是:

public override void  OnActionExecuting(ActionExecutingContext filterContext)
{
    try
    {
        var request = WebRequest.Create(
                      ConfigurationManager.AppSettings["HeartbeatURI"]);
        using (var webResponse = request.GetResponse())
        {
            var response = webResponse as HttpWebResponse;
            if (response != null && response.StatusCode == HttpStatusCode.OK)
            {

有人在这里有任何建议/建议吗?谢谢!

更新:

在提出一些有用的建议后,我将调查浏览器是否提供解决方案,例如:

function setHeartbeat() {
    setTimeout("heartbeat()", 300000); // every 5 min
}

function heartbeat() {
    $.get(
        "http://soemthing:1234/heartbeathandler.ashx",
        null,
        function(data) {
            setHeartbeat();
        },
        "json"
    );
}

将按我的要求执行。

4

1 回答 1

1

您的代码示例没有考虑两个基本问题:

首先,会话是每个客户端的。此解决方案尝试从辅助服务器“检测”单个连接。所以它不会工作。

其次,会话需要客户端交互,通过 cookie 或特殊的额外 URL 值。该解决方案没有尝试合并这些,因此根本不会创建任何会话。

编辑:还有第三个问题:无论您做什么,都不能保证进程中的会话保持活跃;应用程序随时可能被回收,应用程序回收将擦除进程中的会话值。因此,您需要有一些外部会话管理系统,以便维护会话(在两台服务器上)。


不过,真的;尝试像这样保持会话非常脆弱。听起来它对您的应用程序非常重要,但几乎不能保证它会一直工作。IMO,重新引用您的应用程序不需要会话,或者能够即时重建它们,将是一个更好的选择。

于 2012-08-24T11:50:24.667 回答