让ASP.NET无Cookieless会话和JQuery AJAX很好地配合使用

让ASP.NET无Cookieless会话和JQuery AJAX很好地配合使用,asp.net,jquery,ajax,cookies,session-state,Asp.net,Jquery,Ajax,Cookies,Session State,我有一个使用jQueryAjax的网站。使用这个JQuery代码 $.post("/ajax/getsomedata.aspx", {'id': id }, function(data) { dosomething(data); } ); 当我使用cookieless=“false”运行此命令时,id显示在Request.Form中。当我设置cookieless=“true”时,id不再在请求表单中 更新,我做了什么 我添加了对Response.Ap

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

$.post("/ajax/getsomedata.aspx", {'id': id }, 
    function(data) 
    {
        dosomething(data);
    }
);
当我使用cookieless=“false”运行此命令时,id显示在Request.Form中。当我设置cookieless=“true”时,id不再在请求表单中

更新,我做了什么

我添加了对Response.ApplyAppPathModifier()的调用,以保留数据并避免自动重定向。我除了**Diago((并且删除了我自己的,因为他的参考文献对正在发生的事情提供了一些线索。我喜欢独立域的想法,但我不能在这里这样做

以下是更新的代码:

$.post("<%=Response.ApplyAppPathModifier("/ajax/getsomedata.aspx")%>", 
        {'id': id },
    function(data)     
    {        
        dosomething(data);    
    }
);
$.post(“,
{'id':id},
功能(数据)
{        
剂量测定(数据);
}
);
根据Response.ApplyAppPathModifier()如果您处于无Cookie会话状态,则添加会话id,如果未处于无Cookie会话状态,则返回未更改的URL


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

您必须在请求中包含会话令牌。 ASP.Net必须将其添加到url或隐藏表单字段中。获取它并将其添加到jquery参数对象中。
这就是我所能说的,因为我从来没有在ASP.NET中编写过代码,最近我也遇到过同样的问题。这是使用无Cookie会话的四个缺点之一。在访问服务器时,请求会被重写,请求变量会被删除。当使用Web服务和使用ASP.NET.T发布请求时,这可能会非常痛苦使用GET时,他的工作很好

使用普通帖子也会遇到类似的问题。有一篇文章解释了如何做到这一点。MSDN文章还详细讨论了缺点

最好的解决方案是将您的服务放在一个单独的域或IIS虚拟站点上,而不使用cookieless会话


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

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

在调用
PageMethod
期间,会话id未与请求URL一起传递,因此将触发一个新的
session\u 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);
if('==True'){
//需要在请求路径中传递会话id
set_path('(S())/secure/PageName.aspx');
}
PageMethods.PageMethodName(param1、param2、CallSuccess、CallFailed);