让ASP.NET无Cookie会话和JQuery AJAX很好地协同工作

时间:2009-05-15 15:13:56

标签: asp.net jquery ajax cookies session-state

我有一个使用JQuery AJAX的网站。使用这个JQuery代码

$.post("/ajax/getsomedata.aspx", {'id': id }, 
    function(data) 
    {
        dosomething(data);
    }
);

当我使用 cookieless =“false”运行时, id 会显示在 Request.Form 中。当我设置 cookieless =“true”时, id 不再位于 Request.Form 中。

更新,我做了什么

我添加了对Response.ApplyAppPathModifier()的调用以保留数据并避免自动重定向。我除了** Diago((并删除了我自己的,因为他的参考文献对正在发生的事情有所了解。我喜欢看到单独的域名,但我不能在这里做。

这是更新后的代码:

$.post("<%=Response.ApplyAppPathModifier("/ajax/getsomedata.aspx")%>", 
        {'id': id },
    function(data)     
    {        
        dosomething(data);    
    }
);

根据MSDN 如果您处于无Cookie会话状态,则Response.ApplyAppPathModifier()会添加会话ID,如果不是,则返回未更改的URL。

由于没有会话ID,ASP.NET会创建一个新会话并执行重定向(从而剥离任何表单数据)。

3 个答案:

答案 0 :(得分:2)

我最近遇到了同样的问题。这是使用无cookie会话的四个缺点之一。命中服务器时请求被重写,请求变量被删除。使用ASP.Net使用WebServices和POST请求时,这可能会非常痛苦。这在使用GET时工作正常。

使用普通帖子你会遇到类似的问题。有一篇文章here解释了如何完成它。 This MSDN文章也详细讨论了这些缺点。

最佳解决方案是将您的服务放在单独的域或IIS虚拟站点上,而不是使用无Cookie会话。

在无Cookie会话中使用表单身份验证也是一个有趣的挑战。

答案 1 :(得分:2)

我浪费了一整天来解决这个问题,而这只是一个快速解决方案。

PageMethod调用期间,会话ID未与请求URL一起传递,因此新的session_start事件将被触发。我们只需要在调用pagemethod之前设置确切的请求路径,这样就不会触发新的会话启动事件。

if ('<%= HttpContext.Current.Session.IsCookieless %>==True') {
    //need to pass session id in request path
    PageMethods.set_path('<%= System.Web.Configuration.WebConfigurationManager.AppSettings("WebRoot") %>(S(<%=Session.SessionID%>))/secure/PageName.aspx');
}
PageMethods.PageMethodName(param1,param2, CallSuccess, CallFailed);

答案 2 :(得分:0)

您必须在请求中包含会话令牌。 ASP.Net必须在url或hidden表单字段中添加它。抓住它并添加它jquery参数对象。 这就是我可以说因为我从来没有在ASP.NET中编码