Краткий обзор
Пинг обратно в веб-сервис в ajax от клиента поддерживает сеанс пользователя живым, я не хочу, чтобы это происходило.
Более подробное резюме
Для веб-сайта, который мы разрабатываем, нам нужно, чтобы клиент отправил запрос (в js) на веб-сервис (ASMX) на сервере (IIS7.5).Это происходит, чтобы сервер знал, что пользователь все еще находится на сайте и не перешел на другой сайт.
Это так, как наш клиент хочет разрешить пользователям блокировать записи, но если они переходят кдругие сайты, а затем пусть другие люди принимают эти заблокированные записи.Возможно, различие между клиентом, находящимся на сайте, но неактивным и на другом сайте, кажется неважным, но это не имеет значения, я не могу написать спецификацию пользовательского интерфейса, я просто должен заставить его работать.
Мойпроблема в том, что эхо-запрос останавливает тайм-аут пользователя на сервере с помощью стандартного механизма таймаута аутентификации форм.Не удивительно, поскольку 30-секундный пинг в фоновом режиме поддерживает сессию.Даже несмотря на то, что мы хотим знать, находится ли пользователь на сайте, мы хотим, чтобы механизм тайм-аута проверки подлинности форм был соблюден.
Я подумал, что смогу исправить это, удалив ASP.NET_SessionId и.Файлы cookie ASPXAUTH в запросе XMLHttpRequest, который является пингом сервера, но я не могу понять, как это сделать.
Вот как определяются мой веб-сервис и метод:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class PingWS : WebService
{
[WebMethod]
public void SessionActive(string sessionID)
{
// does stuff here
}
ЭтоВот как я это называю в JS (запрос по HTTPS,:
$.ajax({
type: "POST",
url: "PingWS.asmx/SessionActive",
data: 'sessionID=' + aspSessionID + '}',
beforeSend: function (xhr) {
xhr.setRequestHeader('Cookie', '');
xhr.setRequestHeader('Cookie', 'ASP.NET_SessionId=aaa; .ASPXAUTH=bbb;');
},
dataType: "json"
});
Я пытался с setRequestHeader, но это просто добавляет к заголовку, а не перезаписывает заголовок, и IIS радигнорируйте этот мусор, который я добавил.
Я думаю, может быть, я должен попытаться сделать это на стороне сервера, кто-то вынуть PingWS.asmx из цикла, чтобы он не оставлял сеанс активным, ноЯ не уверен, как это сделать.
Несмотря на то, что заголовок вопроса сфокусирован на очистке cookie в заголовке, я был бы очень рад, если бы кто-нибудь указал, что я действительноглупо, и на самом деле есть гораздо лучший способ попытаться сделать то, что я делаю.
Я думаю, на этом этапе, возможно, мне нужно добавить что-то в веб-метод, который говорит, как долго эта конкретная страница быланеактивен, и используйте эти знания для тайм-аута вручную.На самом деле это звучит довольно легко, поэтому я думаю, что я сделаю это сейчас.Я все еще убежден, что должен быть простой способ сделать то, что я первоначально хотел сделать.
Обновление
Я думаю, что я довольно облажался с точки зрения манипулирования cookie здесьпоскольку файлы cookie .ASPXAUTH и ASP.NETSessionId являются HttpOnly, что означает, что браузер забирает их у вас из рук, вы не можете получить к ним доступ через объект document.cookies.Поэтому я бы сказал, что у меня остается:
- Обновление моего веб-метода SessionAlive для отслеживания каждого запроса, чтобы я мог сказать, сколько времени пользователь простаивал на странице и время ожидания в случае необходимости
- Как-то пометить страницу .asmx на стороне сервера, чтобы она вышла из обычного потока аутентификации / отслеживания сеанса
Я знаю, как это сделать 1. Поэтому я начну с 2.кажется мне намного чище.