我在实现服务器站点事件以将数据流回到使用HTML和JavaScript(通过使用EventSource)的WebApplication构建中付出了很多努力。
我在系统中所做的是,一个客户端系统(C#控制台应用程序)正在将数据永久发送到/ getNotification?action = addEventChange&message =“ some text”并在收到后 该消息我想触发一个事件,该事件应将数据发送回我的浏览器应用程序,该应用程序在/ getNotification?action = readEventChange处具有已注册的EventSource。
事件处理工作正常,但是我发现Respons对象在我进一步调用sendIncommingEvent()的回调函数(CB())中不可用。
我到达了一个异常,例如“此响应中没有响应”。
如何使响应对象在回调中也可用? 注册事件处理程序后,我发现了一个麻烦的解决方法进入无限循环(请参阅其他地方是否进行while(true)循环。)
这有时工作良好,有时使IIS崩溃?!
所以请大家在这里帮助我解决问题。
非常感谢。
节食节食者
在下面,您将找到一个示例,该示例是从Web表单中的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);
}
}
}
}
答案 0 :(得分:0)
我建议扩展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);
}