【问题标题】:How to reset ASP.Net sessions state timeout with ajax request如何使用 ajax 请求重置 ASP.Net 会话状态超时
【发布时间】:2012-03-11 13:32:57
【问题描述】:

我正在开发一个 ASP.Net Full-Ajax 站点。因为所有操作都由 Ajax 请求完成,所以任何回发请求都不会发送到服务器。另一方面,我有一个 javascript 计时器,它发送一个 ajax 请求来检查会话,如果它过期,则将用户重定向到登录页面。

问题在这里:当用户在页面上工作 20 分钟并且所有操作将在 20 分钟后处理 ajax 请求时,其会话过期并且用户将在使用页面期间重定向到登录页面(通过该 javascript 计时器)。所以我需要用ajax请求刷新它的会话状态。但是如何?如何通过 ajax 请求重置会话状态超时!?!!

取决于我的谷歌搜索结果,我不能通过 ajax 请求执行,因为 SessionId 作为 cookie 存储在客户端中,要更新它需要执行回发请求:(

注意:会话状态设置为InProc 模式,timeout = 20

对不起,我的英语语法不好,我是英语新手

问候,福罗伊

UPDATE:ajax 请求更新会话状态是否超时?!!

更新:当我的用户登录网站时,我设置了这样的会话:

Session["UserId"] = UserObject.Id;

在我的所有页面中,我使用一些网络方法来执行这样的操作:

[WebMethod]
public static Opr1 (Paramethers...)
{

   //Question is here , how can i update UserId  session to prevent to expire,how can i update it

   //execute my codes to preform Opr1

}

【问题讨论】:

  • 你描述的方式应该没有问题。 Ajax 请求将发送到服务器。当服务器执行一些代码时(实际上,当它刚刚收到一个请求时),它会将会话滑到另外 20 分钟。
  • 我不这么认为,因为我的 ajax 请求不更新会话超时?这里有什么问题?! :(
  • Ajax 请求不需要更新有关会话的任何内容。它只需要到达服务器。它会到达服务器吗?如果可以,请检查断点。
  • 是的 - 每个请求都会扩展会话。

标签: asp.net ajax session-state session-timeout


【解决方案1】:

这就是我的做法:

我有一个简单的网络服务来检查用户是否通过身份验证,但您可以更改代码以检查会话是否未过期。

<%@ WebService Language="C#" Class="CheckAutheticated" %>

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

[System.Web.Script.Services.ScriptService]
public class CheckAutheticated  : System.Web.Services.WebService {

[WebMethod]
public string checkAuthenticated()
{
    return "authenticated";
}

}

那我称之为客户端:

function checkAuthenticated() {
        {
            $.ajax({
                type: "POST",
                url: "CheckAutheticated.asmx/checkAuthenticated",
                data: "{}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: checkAuthenticatedOk,
                error: checkAuthenticatedError
            });
        }
    }
    function checkAuthenticatedOk() { }
    function checkAuthenticatedError() {
        $("#sessionExpiredCover").show();
    }

这里有一些基本的 css

<style type="text/css">
    #sessionExpiredCover {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    z-index: 100000;
    display: none;
    background-color: #fff;
    /*opacity: .7;
    filter:progid:DXImageTransform.Microsoft.BasicImage(opacity=.7);*/
    }
    </style>

最后是 div

    <div id="sessionExpiredCover">
    <div style="background-color:#fff; margin:100px; height:200px; width:400px;"><h1>Session expired</h1>
        <br />
        <asp:HyperLink NavigateUrl="~/Login.aspx" runat="server" Text="Please log in again" />
    </div>
    </div>

【讨论】:

    【解决方案2】:

    如果你使用 WebMethods,你应该像这样装饰你的方法

    [WebMethod(EnableSession = true)]
    

    此外,如果您需要保持会话处于活动状态,您应该尝试创建一个实现 IRequireSessionState 的 HTTPHandler,此接口允许获取/设置(反序列化/序列化)最终会滑动会话超时的会话变量。

    这是一篇关于会话和 ajax 调用的好文章。

    http://seejoelprogram.wordpress.com/2008/11/10/maintaining-aspnet-session-state-in-an-ajax-application/

    希望这会有所帮助

    问候。

    【讨论】:

    • 我在 ajax 调用时遇到了同样的问题,但我使用的是 MVC,我从客户端调用我的操作(我的操作返回 json 数据)。 mvc 中的操作有类似的解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 2013-11-05
    • 2020-12-15
    • 1970-01-01
    • 2011-10-11
    • 2011-04-17
    • 1970-01-01
    • 2011-10-30
    • 2011-02-07
    相关资源
    最近更新 更多