异步通信实现捕捉客户注销信息

来源:互联网 发布:淘宝旺铺导航条 编辑:程序博客网 时间:2024/05/01 08:22

 

由于ASP.NET是基于服务端的编程框架,因此我们很难在服务端用代码来保存客户端的注销信息,原因有以下两点:

1.有些用户经常以关闭浏览器的形式(想睡觉了,不想看网页了)来“注销”,由于这一事件是属于客户端触发,服务端无法捕捉,更谈不上在这个事件保存用户注销信息了。 

2.也有些用户经常在浏览器中输入其他网址(他要访问别的网站了)来实现“注销”,同样的,这个客户端事件服务端也无法捕捉。

分析以上两点,可以看出服务端对客户端事件的处理显得有心无力,究其本质原因,是由于Web Application与生俱来的执行方式造成的(略过),因此不得不引入另外的方法:Javascript 来捕捉客户端事件,用Web Service来实现服务端保存注销信息。

ASPX页面代码如下:

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

</script>
<script  type="text/javascript">
//页面卸载事件(用户关闭浏览器或者转向其他页面都会触发此事件)
function pageUnload()
{
    
//用户帐号,实际应用的话可以从Session或者ViewState获取,这里不演示
    var Account="dreamjhy";
    
//调用WebService中UserLogout方法保存用户注销信息(例子从简,只获取用户帐号和注销时间)
    WebService.UserLogout(Account);
}

</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    
<title>无标题页</title>
</head>

<body>
    
<form id="form1" runat="server">
         
<!--生成WebService客户端代理-->
        
<asp:ScriptManager ID="ScriptManager1" runat="server"> 
        
<Services>
        
<asp:ServiceReference Path="WebService.asmx" />
        
</Services>
        
</asp:ScriptManager>
    
<div>
    
</div>
        
<!--该按钮用于转向其他页面,从而触发PageUnload事件-->
        
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="Default.aspx">转向其他页面</asp:HyperLink>
    
</form>
</body>
</html>

 

WebSerive代码如下:

 

<%@ WebService Language="C#" Class="WebService" %>

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml;

[WebService(Namespace 
= "http://tempuri.org/")]
[WebServiceBinding(ConformsTo 
= WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
//暴露WebService中方法给客户端
public class WebService  : System.Web.Services.WebService {

    [WebMethod]
    
public void UserLogout(string account)
    
{
        
//由于使用SQL比较麻烦,这里使用Xml作为数据源
        
//创建一个XmlDocument对象用于操作Xml文档
        XmlDocument M_XmlDocument = new XmlDocument();
        
try
        
{
            
//加载XML文档
            M_XmlDocument.Load(Server.MapPath("XMLFile.xml"));      //注意:必须为绝对路径,使用相对路径会加载错误。
            
//创建一个新结点
            XmlElement NewXmlElement = M_XmlDocument.CreateElement("UserLogout");
            
            
//一种添加属性的方法
            
//为新结点创建"帐号"属性
            XmlAttribute NameAttribute = M_XmlDocument.CreateAttribute("UserName");
            NameAttribute.Value 
= account;
            
//为新结点创建"注销时间"属性
            XmlAttribute LogoutTimeAttribute = M_XmlDocument.CreateAttribute("LogoutTime");
            LogoutTimeAttribute.Value 
= System.DateTime.Now.ToString();
            
//将"帐号"和"注销时间"两个属性添加到新结点中
            NewXmlElement.Attributes.Append(NameAttribute);
            NewXmlElement.Attributes.Append(LogoutTimeAttribute);
            
            
////另外一种更加简便的添加属性的方法,就下面两句
            //NewXmlElement.SetAttribute("UserName", name);
            
//NewXmlElement.SetAttribute("LogoutTime",System.DateTime.Now.ToString());
            
            
//将新结点添加到XML中
            M_XmlDocument.DocumentElement.AppendChild((XmlNode)NewXmlElement);
            
//保存XML文档
            M_XmlDocument.Save(Server.MapPath("XMLFile.xml"));//注意:必须为绝对路径,使用相对路径会保存错误。
        }

        
catch (Exception e)
        
{
             
        }

       
    }

    
}



执行后XML文档显示如下:

<?xml version="1.0" encoding="utf-8"?>
<UserLogoutList>
  
<UserLogout UserName="dreamjhy" LogoutTime="2007-12-25 19:43:08" />
</UserLogoutList>
原创粉丝点击