保持ASP.NET会话活跃

时间:2012-08-24 11:29:23

标签: c# asp.net-mvc-3 session

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

有没有人建议如何让父会话与子网站会话保持一致?

我最初的想法是创建一个ActionFilter来将HttpWebRequest触发到OnActionExecuting方法上父站点上的各种HTTPHandler。人们一直怀疑这会如何使特定会话保持内联,或许缺少有关会话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"
    );
}

将按照我的要求执行。

1 个答案:

答案 0 :(得分:1)

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

首先,会话是每个客户端。此解决方案尝试“心跳”来自辅助服务器的单个连接。所以它不会起作用。

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

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


但是真的;尝试保持这样的会话是非常脆弱的。听起来它对你的应用程序非常重要,但几乎不能保证它会一直运行。重新认识您的应用程序不需要会话,或者能够动态重建它们,将是一个更好的选择,IMO。