【发布时间】:2011-05-14 14:05:01
【问题描述】:
快速总结
从客户端 ping 回 ajax 中的 Web 服务使用户的会话保持活动状态,我不希望这种情况发生。
更广泛的总结
对于我们正在开发的网站,我们需要客户端(在 js 中)ping 回服务器 (IIS7.5) 上的 Web 服务 (ASMX)。这恰好让服务器知道用户仍在该站点上,并且没有浏览到另一个站点。
这是因为我们的客户想让用户锁定记录,但如果他们浏览到其他站点,那么让其他人接管这些锁定的记录。也许客户端在站点上但处于非活动状态和在另一个站点上的区别似乎并不重要,但这有点无关紧要,我不会编写 UI 规范,我只需要让它工作。
我的问题是,ping 通过标准表单身份验证超时机制阻止用户在服务器上超时。这并不奇怪,因为后台有 30 秒的 ping 使会话保持活跃。即使我们想知道用户是否仍在站点上,我们也希望能够尊重正常的表单身份验证超时机制。
我认为我可以通过删除作为服务器 ping 的 XMLHttpRequest 中的 ASP.NET_SessionId 和 .ASPXAUTH cookie 来解决此问题,但我不知道该怎么做。
这就是我的网络服务和方法的定义方式:
[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,但如果有人指出我真的很愚蠢并且实际上有更好的方法来尝试做我想做的事情,我会非常高兴正在做。
我正在考虑在这个阶段,也许我需要在 webmethod 中添加一些内容,说明该特定页面已停用多长时间,并使用该信息手动超时。这实际上听起来很容易,所以我想我现在就这样做。我仍然坚信一定有一种简单的方法可以完成我最初想做的事情。
更新
我认为我在这里的 cookie 操作方面非常糟糕,因为 .ASPXAUTH 和 ASP.NETSessionId cookie 都是 HttpOnly,这意味着浏览器会将它们从你手中拿走,你不能通过document.cookies 对象。所以我想说的是:
- 更新我的 SessionAlive Web 方法以跟踪每个请求,这样我就可以知道用户在页面上闲置了多长时间并在需要时超时
- 以某种方式在服务器端标记 .asmx 页面,使其脱离正常的身份验证/会话跟踪流程
我知道怎么做 1. 所以我会从那里开始但是 2. 对我来说似乎更干净。
【问题讨论】:
标签: asp.net ajax xmlhttprequest asmx iis-7.5