我正在努力实现服务器站点事件以将数据流回到使用HTML构建的Web应用程序(通过使用EventSource)。
我在我的系统中做的是,客户端系统(C#控制台应用程序)永久地将数据发送到/ getNotification?action = addEventChange&message =“some text”,并且在收到该消息后我想触发应该发送数据的事件回到我的浏览器应用程序,该应用程序在/ getNotification中注册了EventSource?action = readEventChange。
事件处理工作正常,但我发现,响应对象在我的回调函数(CB())中不可用,我调用了另外的sendIncommingEvent()。
我遇到了一个例外情况,例如“在这种情况下无法获得响应”。
如何在回调中使响应对象可用?在注册eventhandler之后,我发现了一个混乱的变通方法进入一个无限循环(请参阅我在哪里进行while(true)循环。)
那工作有时很好,有时它会让我崩溃的IIS?!
所以请各位帮助我解决我的问题。
提前谢谢了。
干杯迪特
下面您将从webform中找到我的cs函数中的代码。
namespace xxxx
{
public partial class getNotification : System.Web.UI.Page
{
private static event EventHandler myHandler;
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["action"] == "addEventChange")
{
string sMsg = Request.QueryString["message"];
commonAESStuff.addEventChange(sMsg);
fireEvent(EventArgs.Empty);
}
else if (Request.QueryString["action"] == "readEventChange")
{
myHandler += CB;
while (true)
{
System.Threading.Thread.Sleep(1000);
}
}
public void sendIncommingEvent(string s)
{
try
{
Response.ContentType = "text/event-stream";
Response.Write("data:" + s.ToString() + "\n\n");
Response.Flush();
}
catch (Exception ex)
{
}
}
private void CB(object sender, EventArgs e)
{
string s = commonAESStuff.getEventChanges();
sendIncommingEvent(s);
}
protected virtual void fireEvent(EventArgs e)
{
EventHandler handler = myHandler;
if (handler != null)
{
handler(this, e);
}
}
}
}
我建议扩展EventArgs以包含message属性
public void sendIncommingEvent(string s)
{
try
{
HttpContext.Current.Response.ContentType = "text/event-stream";
HttpContext.Current.Response.Write("data:" + s.ToString() + "\n\n");
HttpContext.Current.Response.Flush();
}
catch (Exception ex)
{
}
}
public class NotificationEventArgs : EventArgs
{
public string Message{ get; set; }
public NotificationEventArgs (string message)
{
Message= message;
}
}
并附上这样的事件
myHandler += new EventHandler<NotificationEventArgs>(CB);
并实现这样的回调,
private void CB(object sender, NotificationEventArgs e)
{
// string s = commonAESStuff.getEventChanges();
string s= e.Message;
sendIncommingEvent(s);
}