asp.net ashx 处理程序 session 超时和 jquery ajax 调用

标签 asp.net jquery

我正在 asp.net 中开发一个 Web 表单应用程序,并使用 jquery ajax 调用进行大部分操作。对于服务器操作,我使用 ashx 处理程序。

我的问题是,当用户的 session 过期(一段时间不活动后),并且用户单击进行 jquery ajax 调用的按钮时,如何从处理程序检测 session 过期并返回特定的 json。

一个similar qustion但没有正确的答案。

提前致谢。

rgds 里夫基

最佳答案

一种方法是检查 global.asax 文件中任何 ashx 的 session 是否已过期。如果有,则返回 json session 过期对象。在客户端,您将检查该对象是否存在并通过 JavaScript 将用户重定向到登录页面。

因此,在您的 global.asax 文件中,您将具有如下内容:

   protected void Application_AcquireRequestState(object sender, EventArgs e)
    {
        var url = HttpContext.Current.Request.Url.OriginalString;
        var extension = Path.GetExtension(url);
        if (extension == ".ashx" && HttpContext.Current.Session.Contents.Count == 0)
        {
            HttpContext.Current.Response.StatusCode = 440;
            HttpContext.Current.Response.TrySkipIisCustomErrors = true;
            HttpContext.Current.Response.Write(new JObject(new JProperty("sessionExpired")).ToString());
            HttpContext.Current.Response.End();
        }
    }

然后,您将为所有查找“sessionExpired”对象的 ajax 查询创建一个全局 ajax 事件错误处理程序:

$(document).ajaxError(function (event, xhr, settings)
{
    if (xhr.responseText && $.parseJSON(xhr.responseText).sessionExpired)
    {
        window.location.replace("loginUrl.aspx");
        return;
    }
});

这种方法的好处是,您只需拥有这两段代码即可获得合理的 session 过期处理。然而,这种方法有一个缺点:

所有 ashx 文件必须至少具有 IReadOnlySessionState 或 IRequiresSessionState 接口(interface)。否则, session 过期逻辑将被触发,因为 session 将被假定为空。如果您不希望这样做,那么您需要一种方法来排除某些 .ashx 文件,例如排除包含包含您的 ashx 文件的特定路径的任何 url。

此外,如果页面的某些部分不涉及使用 session ,那么您也需要排除这些页面。

关于asp.net ashx 处理程序 session 超时和 jquery ajax 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6421942/

相关文章:

asp.net - 使用JW Player播放音频,仅显示控制栏

javascript - 粘性按钮到 sidr 侧面板

jquery - 如何在 requestheader 中设置 CSRF token 以传入 $.post 方法调用

asp.net - ASP.NET MVC 应用程序的高级主题

asp.net - "Re-Raising".NET 中的自定义事件(本例中为 ASP.NET)

asp.net - 使用 ajax 触发异步调用时复选框选中事件的事件名称是什么?

c# - LINQ 和可选参数

javascript - 如何添加从 JSON 文件中获取图像,添加类并追加到 div 中?

javascript - 如何在 FLASK 中使用 ajax 发布数据后渲染模板?

javascript - 将 Click 事件附加到 Bootstrap Toggle 单选按钮