【问题标题】:Keeping ASP.NET Session alive保持 ASP.NET 会话活动
【发布时间】:2012-08-24 11:29:23
【问题描述】:

根据我们当前的设置,需要在两个站点之间维护镜像会话,一个在 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"
    );
}

将按我的要求执行。

【问题讨论】:

  • 我什至无法想象你认为代码会如何做你认为它会做的事情。
  • @AndrewBarber 还有什么更具建设性的补充吗?
  • 我真的完全不知道如何解决这个问题,因为您似乎不了解会话的工作原理,从该代码。我的观点是:那行不通。但是不...我现在没有时间解释会话基础知识。也许稍后我会尝试回答。
  • @AndrewBarber 非常感谢。

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


【解决方案1】:

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

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

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

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


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

【讨论】:

  • 第一点主要是为什么我将问题发布给 SO。显然,代码示例没有考虑到这一点,所以我正在寻找一个解决方案......关于你的第二点,要求只是点击客户端开发团队在指定 URL 处编写的 HTTP 处理程序。您是否建议这种方法无论如何都行不通?
  • 是的,这种方法无论如何都行不通;不会维护/刷新任何会话,因为您没有尝试传递与会话相关的信息,这些信息很可能包含在 cookie 值中。从 网络浏览器 对页面进行“刷新”是可行的,因为网络浏览器会随每个请求发送会话 cookie。您的解决方案没有这样做。
  • 那么,作为一种解决方案,从客户端向处理程序发送“刷新”也会传递会话 cookie 信息吗?我认为这可以通过javascript处理?作为替代方案,我是否无法从 HttpContext.Current 访问 Session 信息?这个不能用吗?
  • 实际上,默认情况下,将其发送到 ASHX 处理程序不会工作,因为默认情况下,ASHX 处理程序设置为不识别会话。您必须将某个属性应用于处理程序才能使其正常工作。假设你这样做,是的;从浏览器中的网站“刷新”某些 URL 将有助于保持会话处于活动状态,您很可能会使用 Javascript 来做到这一点。我建议使用微小的 AJAX 请求。 但是,我忽略了另一个重要的警告,我现在正在编辑我的答案。
  • 感谢您的意见;无论结果如何,这个过程都是完全缓解边缘情况。它应该保持用户身份验证,没有其他任何东西,如果没有这个,父母会将用户反弹到网站的登录名,这虽然不是有害的,但不能提供完全令人满意的用户体验。我将通过 jS/jQuery 采用 AJAX 方法并进一步调查。
猜你喜欢
  • 2010-11-28
  • 2012-07-19
  • 2010-10-22
  • 2014-11-26
  • 2012-08-10
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多