C#ASP服务器发送事件的问题

时间:2018-09-04 11:25:08

标签: c# asp.net webforms server-sent-events

我在实现服务器站点事件以将数据流回到使用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);
            }
        }
    }
}

1 个答案:

答案 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);
    }