2011-08-18 62 views
2

好的。 所以基本上我正在一个网页上的消息系统。 我的网页上的用户可以发送其他消息,但现在我希望消息在发送时在接收者屏幕上“弹出”。就像当Facebook上的某个人在线上给你发送消息时,消息就会变成红色。为了解决我的问题,我需要每个客户知道哪些其他客户目前在线。我已经通过编码在我的Global.asax观察员样模式解决了这个:在这种情况下ASP.NET更新另一个客户端上的UpdatePanel

public static void AddObserver(Observer o) 
    { 
     if(!observers.Contains(o)) 
      observers.Add(o); 

     System.Diagnostics.Debug.WriteLine("Observer tilføjet : " + observers.Count); 
    } 

    public static void RemoveObserver(Observer o) 
    { 
     if (observers.Contains(o)) 
      observers.Remove(o); 

     System.Diagnostics.Debug.WriteLine("Observer fjernet : " + observers.Count); 
    } 

    public static void NotifyObserversNewMail(Observer observer) 
    { 
     foreach (Observer o in observers) 
      if(!o.Equals(observer)) 
       o.UpdateNewMail(); 
    } 

和观察者,我只是在的Site.Master,这是我做出延长观察类:

public partial class SiteMaster : System.Web.UI.MasterPage, Observer 
{ 
    protected void Page_Unload(object sender, EventArgs e) 
    { 
     Session["observer"] = this; 
     Global.AddObserver(this); 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     //ADD OBSERVER TO GLOBAL.ASAX 
     if (Session["observer"] != null) 
      Global.RemoveObserver((Observer)Session["observer"]); 

    public void Update() 
    { 
     DLMessages.DataSource = ServiceMessages.GetInstance().GetMessages(); 
     DLMessages.DataBind(); 

     UPMessages.Update(); 
    } 

其中DLMessages是UpdatePanel UPMessages内的DataList。

所以我们有一个“发送者”客户端和一个“接收者”客户端。 当发送者创建一个新的消息,该方法被调用:

protected void MessageSend(object source, EventArgs args) 
    { 
     Page.Validate("ValGroupMessageTo"); 
     if (Page.IsValid) 
     { 
       ServiceMessages.GetInstance().SendMessage(ServiceCommunity.GetInstance().GetUser(MessageTo.Text).Id, ((User)Session["user"]).Id, MessageMessage.Text); 

      Global.NotifyObserversNewMail((Observer)Session["observer"]); 

      ClosePopups(new object(), new EventArgs()); 

      Update(); 
     } 
    } 

正如你可能会注意到它调用Global.asax中通知和更新()直接在本身。 “发件人”端的UpdatePanel完全更新,但在接收端没有任何反应。反正不在UpdatePanel中。 原因如果我更改Update()中的代码以运行来自数据库的消息,我可以看到消息被调用正常,并且新消息被加载。只是没有更新到UpdatePanel。 所以我一直在想,为什么updatepanel在数据更新时不会在“receiver”端更新,而我的结论是,这是因为在“receiver”端没有部分回传。是的,Update()方法被调用,但是没有回传。所以我的问题是这样的: 是否有可能从代码隐藏中“强制”回部分回传?还是有另一种解决方案可能更好?

希望这是有道理:-)

+0

你是不是想从服务器推送更新到客户端硬盘的方式,没有客户端请求它还是我弄错了吗? – besamelsosu

+0

多数民众赞成正是什么即时通讯试图做..不可能? – Kaa

+0

据我所知。因为客户端不像服务器,它不断地等待请求。客户端发出请求并等待响应。 – besamelsosu

回答

0

我不是专家,但你可以尝试与相关的使用Javascript/jQuery的SetTimeout功能的WebService(.SVC)从客户端做定期请求,并从数据服务器。

0

这些解决方案,彗星等工作,但真的是你最好的选择是使用socket.io Real Time Browser Applications 你也可以用Backbone.js的结合,并有一个非常好的应用。我帮助制作了一个基于这些2的实时网络信使。

+0

在.NET世界 - SignalR :) – Stilgar

1

帮你一个忙,并使用SignalR构建整个事情。它是用于.NET服务器和浏览器(包括客户端库)之间实时通信的库。

如果你坚持这样做,你应该使用timer触发更新面板更新