【问题标题】:Problems with C# ASP server sent eventC# ASP 服务器发送事件的问题
【发布时间】:2023-03-06 21:57:02
【问题描述】:

我正在努力实现服务器站点事件以将数据流式传输回使用 HTML 和 JavaScript 构建的 WebApplication(通过使用 EventSource)。

我在我的系统中所做的是,客户端系统(C# 控制台应用程序)将数据永久发送到 /getNotification?action=addEventChange&message="some text" 并在接收到 该消息我想触发一个事件,该事件应将数据发送回我的浏览器应用程序,该应用程序在 /getNotification?action=readEventChange 注册了 EventSource。

事件处理工作正常,但我发现 Respons 对象在我的回调函数 (CB()) 中不可用,我进一步调用了 sendIncommingEvent()。

我遇到了一个异常,例如“响应在此上下文中不可用”。

如何使响应对象在我的回调中也可用? 在注册事件处理程序后,我发现了一个混乱的解决方法进入无限循环(如果我在哪里执行 while(true) 循环,请查看 else。)

这有时很好用,有时却让我的 IIS 崩溃?!

所以请大家帮我解决我的问题。

非常感谢。

迪特干杯

您可以在下面找到一个示例,即从网络表单中从我的 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);
            }
        }
    }
}

【问题讨论】:

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


    【解决方案1】:

    我建议扩展 EventArgs 以包含消息属性

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

    【讨论】:

    • 嗨,我测试了它,我进入了 sendIncommingEvent() 仍然是 {"Response is not available in this context."} 所以我仍然无法从回调访问响应对象了?!
    • 顺便说一句,我在附加事件后删除了 while true 循环
    • 请使用当前上下文获取响应对象,上面编辑代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2015-09-24
    • 2015-06-16
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    相关资源
    最近更新 更多