我们在传统的web程序当中比较头疼的一件事是屏幕的刷新感。虽然有server push的技术,但在IE中较难实现。现在webservice给了我们这样一个机会,大家都知道webservice是基于soap的,而soap是xml的应用,如果你曾经用过ms xml sdk3.0的话就会知道里面有个xmlhttp方法,其实在那时我们就已经可以用xmlhttp的方式替代Form了,也是无刷新的,其实准确地说是局部刷新,下面我们来看一下怎样做,先做一个chat webservice, 首先来分析一下,一个聊天室应具备的两个要素人和消息,这样我们可以建立一个类型(记得我在以前说过类也是类型),它包含这样两个要素。 ///ChatMessage.cs using System;
namespace chat { /// <summary> /// ChatMessage类封装了两个string变量:UserLists--用户列表,Messages--要传递的信息 /// </summary> public class ChatMessage { public string UserList, Messages; } } 第二个我们要建立的是什么呢?一个聊天室应能存储在线成员的名字及访问时间 ///Member.cs using System;
namespace chat { /// <summary> /// Member类为每个聊天者封装了Server端的变量 /// </summary> public class Member { // 存储消息的队列 public string UserName, MsgQueue; // 判断滞留事件以便踢人 public System.DateTime LastAccessTime; // The constructor public Member(string NickName) { this.UserName=NickName; this.LastAccessTime=DateTime.Now; } } }
接下来我们就应该做这个asmx了 ///ChatWebService.asmx using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Web; using System.Web.Services;
namespace chat { /// <summary> /// Summary description for ChatWebService. /// </summary> [WebService (Namespace = "http://localhost/chat/", Description = "This service provides an chat service")] public class ChatWebService : System.Web.Services.WebService { public ChatWebService() { //CODEGEN: This call is required by the ASP.NET Web Services Designer InitializeComponent(); }
#region Component Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { } #endregion
/// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { }
[WebMethod(Description="接收用户名作为参数存储到Application对象中")] public string Login(string username) { // Ascertain that all the registered chat participants are active CheckMembersList(); // Synchronization Lock Application.Lock(); // Get the collection of keys for the Application Variables String[] Members = Application.AllKeys; // Are there any registered chat members? & the present request is for a unique nick name? if ((Members.Length>0)&&(Array.IndexOf(Members,username)>-1)) { throw new Exception("该用户已存在!"); } // Create a new Member object for this participant Member NewMember = new Member(username); // Add this new member to the collectionof Application Level Variables Application.Add(username, NewMember); // Synchronization unlock Application.UnLock(); // Go and get the list of current chat participants and retrun the list return GetMembersList(); }
[WebMethod(Description="GetMsg方法用用户名和消息为参数返回一个ChatMessage对象,包括要传递的消息和用户列表")] public ChatMessage XchangeMsgs(string username, string Msg) { // Ascertain that all the registered chat participants are active CheckMembersList(); // Synchronization Lock Application.Lock(); // Get the collection of keys for the Application Variables String[] Members = Application.AllKeys; if ((Members.Length==0)||(Array.IndexOf(Members,username)==-1)) // Are there any registered chat members? & the present request is for a unique nick name? { throw new Exception("你当前可能没有登陆或登陆超时,请重新登陆!"); } ChatMessage RetMsg = new ChatMessage();
RetMsg.UserList = GetMembersList(); // Loop through all the Chat Participant's serverside Member Objects and // add the message just received in their waiting message queue for (int x=0;x<Members.Length;x++) { Member temp = (Member)Application[Members[x]]; temp.MsgQueue+=("<BR><Font color = Red>" + username + " 说:<BR></FONT><Font color = Blue>" + Msg); if (temp.UserName == username) { RetMsg.Messages = temp.MsgQueue; temp.MsgQueue=""; temp.LastAccessTime=DateTime.Now; } } // Synchronization unlock Application.UnLock(); return RetMsg; }
[WebMethod(Description="GetMsg方法用username为参数返回一个ChatMessage对象,包括要传递的消息和用户列表")] public ChatMessage GetMsgs(string username) { Application.Lock(); CheckMembersList(); Application.Lock(); String[] Members = Application.AllKeys; if ((Members.Length==0)||(Array.IndexOf(Members,username)==-1)) { throw new Exception("Unknown User. Please Login with a UserName"); } ChatMessage RetMsg = new ChatMessage(); RetMsg.UserList = GetMembersList(); Member temp = (Member)Application[username]; RetMsg.Messages = temp.MsgQueue; temp.MsgQueue=""; temp.LastAccessTime=DateTime.Now; Application.UnLock(); return RetMsg; }
public string GetMembersList() { Application.Lock(); String UserList = ""; String[] Members = Application.AllKeys; Application.UnLock(); for (int x=0;x<Members.Length;x++) { Member temp = (Member)Application[Members[x]]; UserList += (temp.UserName+"\n"); } return UserList; }
private void CheckMembersList() { String[] Members = Application.AllKeys; ArrayList RemoveList = new ArrayList(); for (int x=0;x<Members.Length;x++) { Member temp = (Member) Application[Members[x]]; int test = (DateTime.Now.Subtract(temp.LastAccessTime)).Minutes; if (test > 2) { RemoveList.Add(Members[x]); } } // Users = null; for (int count = 0;count<RemoveList.Count;count++) { Application.Remove((String)RemoveList[count]); } return; }
&nb
|