好的。 所以基本上我正在一个网页上的消息系统。 我的网页上的用户可以发送其他消息,但现在我希望消息在发送时在接收者屏幕上“弹出”。就像当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()方法被调用,但是没有回传。所以我的问题是这样的: 是否有可能从代码隐藏中“强制”回部分回传?还是有另一种解决方案可能更好?
希望这是有道理:-)
你是不是想从服务器推送更新到客户端硬盘的方式,没有客户端请求它还是我弄错了吗? – besamelsosu
多数民众赞成正是什么即时通讯试图做..不可能? – Kaa
据我所知。因为客户端不像服务器,它不断地等待请求。客户端发出请求并等待响应。 – besamelsosu