Хорошая совместная работа сессий ASP.NET Cookieless и JQuery AJAX - PullRequest
6 голосов
/ 15 мая 2009

У меня есть веб-сайт, который использует 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 Response.ApplyAppPathModifier () добавляет идентификатор сеанса, если вы находитесь в состоянии сеанса без файлов cookie, и возвращает неизмененный URL-адрес, если это не так.

Поскольку идентификатор сеанса отсутствует, ASP.NET создает новый сеанс и выполняет перенаправление (таким образом удаляя любые данные формы).

Ответы [ 3 ]

2 голосов
/ 15 мая 2009

Я недавно боролся с той же проблемой. Это один из четырех недостатков использования сеансов без файлов cookie. Запрос переписывается при попадании на сервер, и переменные запроса удаляются. Это может быть чрезвычайно болезненно при использовании WebServices и POST-запросов с использованием ASP.Net. Это прекрасно работает при использовании GET.

У вас будет похожая проблема при использовании обычной записи. Здесь есть статья , в которой объясняется, как это можно сделать. В этой статье MSDN также подробно рассматриваются недостатки.

Лучшее решение - разместить ваши службы в отдельном домене или на виртуальном сайте IIS, не используя сеансы без файлов cookie.

Использование проверки подлинности с помощью форм с сеансами без файлов cookie также представляет собой интересную задачу.

2 голосов
/ 28 августа 2012

Я потратил весь свой день, чтобы разобраться с этой проблемой, пока это только быстрое решение.

Во время вызова PageMethod идентификатор сеанса не передается с 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);
0 голосов
/ 15 мая 2009

Вы должны будете включить токен сеанса в свой запрос. ASP.Net должен добавлять его в поля URL или скрытой формы. Возьмите его и добавьте в него объект параметра jquery. Это, насколько я могу сказать, потому что я никогда не кодировал в ASP.NET

...