在Session_End事件中判断就可以了。

解决方案 »

  1.   

    在Global.asax中的Session_End事件中处理,Session_End事件在用户没有任何动作,Session超时后引发!象楼主说的情况是没法立即判断当前用户是不是已经退出了!--------------------------------
    AspNetPager 免费分页控件4.2版发布,同时发布最新源代码,欢迎下载:http://www.webdiyer.com
      

  2.   

    只有等session超时了,因为web是无连接.网页打开好就与服务器断来,所以服务器不知道,用户是否退出了,只有等了一个时间用户还没有再次访问,还可以判断!
      

  3.   

    非正常情况下,服务器端是不可能获知客户端已经掉线,因为Http协议是无状态的不过,对于Session来说,客户端一段时间没有访问,就会自动的断掉,就是所谓的Session超时,这个时侯也会引发Session_End事件
      

  4.   

    其实我做的是从网页上用Windows Media Player看电视转播的,如果超时的话,这个不好办呀
      

  5.   

    象 webdiyer(陕北吴旗娃) 说的情况是没法立即判断当前用户是不是已经退出了!在Global.asax中的Session_End事件中处理,Session_End事件在用户没有任何动作,Session超时后引发!
      

  6.   

    试试这个,跟思归学的:)<script language="javascript">
    function window.onunload()
    {
      if (event.clientX <0 && event.clientY <0 )
      {
       window.open("logout.aspx","logoout");

      }
    }
    </script>
    在logout.aspx中,修改数据库状态吧,别忘了调用<% Session.Abandon() %> :)
      

  7.   

    Session_End()只能用于用户Session超时和正常退出时才有效, 如果要判断他因其他原因, 如直接关闭窗口、断电或和其他的非正常操作情况下的退出, 只能靠其他用户去更新数据库,  大致上是用"当前时间-用户最后活动时间>某值"才判断标准.
      

  8.   

    B/S最大的特点和特色也是无状态的!Session_End不能实现搂主的意思!也只能是近似实现!服务器是不关心客户端的!
      

  9.   

    如果是用户直接关掉浏览器的话,可以用javascript判断<script language=javascript>
    function window.onunload()
    {
      if(event.clientX<0 && event.clientY<0)
    {
       <%# SignOut()%>
    }
    }cs中public void SignOut()
    {
       //获得用户值
       //更新数据库
    }
    </script>
    对于断电和其他非正常因素,可以采用xmlhttp来维持客户端和服务器端的状态,如果一定时间内(例如15秒)服务器端接收不到客户端的状态信息,则判定为断线客户端:
    <script language=javascript>function  SendStateMessage()

            var szRequest = "<State myState='";
    szRequest += 1;
    szRequest += "'></State>";
    var objHTTP = new ActiveXObject("Microsoft.XMLHTTP");
    var szURL = "some.aspx";
    var szHttpMethod = "POST";
    objHTTP.Open(szHttpMethod, szURL, false);
    objHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    objHTTP.Send(szRequest);……
    }
    然后服务器端再用xmlDom接收……有点麻烦,呵呵
      

  10.   

    可以用客户端事件window.onbeforeunload加WebService实现;
    不过这种方式无法控制断电之类的问题,解决直接关闭浏览器还是没问题的:)
      

  11.   

    我想直接关闭窗口没问题的,但断电或掉线之类的呢,如像cyp503所说一样:但服务器如何收到呢
      

  12.   

    原理和asp一样,写起来不同罢了http://www.sayee.com/cloudchen/js/ou/online.asp
      

  13.   

    断电可以让数据库或其他用户来做检索,规定大于一段时间的用户就删除sql server可以用agent
      

  14.   

    每隔一段时间从客户端发回一个xml信息,如果一定时间内,服务器没有接收到该信息,则就判定为断线,在服务器端,当作一个xmldocument处理
      

  15.   

    我是这么做的,在你的所有页面(一般都有几个公用的ascx的,放那里面就可以了)中添加一个高和宽都为0的iframe src=refresh.aspx,然后refresh.aspx每分钟或者一个你觉得合适的时间自动刷新<meta http-equiv="refresh" content="170;">, 然后设置Session时间为2-3分钟,那么当用户直接关闭窗口后,最多延迟3分钟就可以将用户刷出去了。当然不能做到完全实时,但可以缩短默认的延迟时间,呵呵
      

  16.   

    补充下,refresh.aspx里什么内容都不用做,呵呵
      

  17.   

    其实我做的是从网页上用Windows Media Player看电视转播的,不能自动刷新的。如果自动刷新的话,这个不好办呀,难道打断用户正常观看呀???
      

  18.   

    用iframe刷新不会影响的。用户基本感觉不到刷新的。
      

  19.   

    哦,lese9提供的思路很棒哦。我也是对这个问题一直理不清楚。
      

  20.   

    我做过一个定时刷新的用户在线的功能。
    就是做一个隐藏的页定时刷新数据库,
    还有得在online加一个最后登录时间字段,
    这样在定时刷新页面里每刷新一次就更新最后在线时间,并且更改超过规定时间没有刷新的用户状态;
    当用户非正常退出时重新登录就得先把规定时间没登录的用户记录更改状态先。这样好象要和DB打的交道太多了,而且我怀疑没说清楚··
      

  21.   

    定时刷新 + 数据库建一online表,有一字段tim用来记录时间,用户登陆时将tim写为登陆时间页面每隔 t 时间刷新,检查字段tim和当前时间的差,如果差大于t,则用户已退出,
    否则还没退出,则把字段tim更新为当前时间,以备下一次刷新时比较用只要有用户打开该页面就会检查字段tim和当前时间的差
    注意,这里的检查是检查online表所有的用户
      

  22.   

    在ASP.NET不用SESSION,用FORM来作用户验证能解决这种问题
      

  23.   

    cyp503:你所说的方法是不是会占用服务器资源呢?
      

  24.   


    Session_End()仅用于用户Session超时和正常退出时才有效
    一般用户不会正常退出的!!!可以使用下面的方法.
    (1)页面方式时:(刷新iframe要尽量小)建立一个实时在线用户表(online表),用户登录后将uptime写为登录时间.设定一个时间差t,比如1分钟每1分钟后页面刷新,有客户端的用户,将用当前系统时间更新uptime字段,无客户端的用户(既退出者)因未刷新将不再更新
    每次刷新时,用当前时间与online表所有用户的uptime进行比较.如时间差大于1分钟,则表示用户已退出.
    (2)用页面嵌入winform的方式时可以从客户端定时发送xml数据包来决定
      

  25.   

    其实我说的iframe的refresh.aspx根本不用写任何代码,只需要在VS.NET中创建一个默认的ASP.NET叶面,然后把<meta http-equiv="refresh" content="自动刷新的秒数;">放到页头上,不用写到数据库,那样效率是个问题,只需要修改web.config中的sessionState节的timeout值为你想要的就可以了,当然了,timeout值要大于refresh中的时间。
      

  26.   

    lese9(乐色.Net)的方法最简单:)  我就这么用的 很方便 代码量也很小!!