Проблемы с отправленным событием ASP сервера C # - PullRequest
0 голосов
/ 04 сентября 2018

Я много борюсь за реализацию событий сайта сервера для потоковой передачи данных обратно в сборку WebApplication с HTML и JavaScript (через EventSource).

Что я делаю в своей системе, так это то, что клиентская система (приложение консоли C #) постоянно отправляет данные в / getNotification? Action = addEventChange & message = "некоторый текст" и после получения это сообщение, которое я хочу вызвать событие, которое должно отправить данные обратно в мое браузерное приложение, которое имеет зарегистрированный EventSource в /getNotification?action=readEventChange.

Обработка событий работает нормально, но я выяснил, что объект Respons недоступен в моей функции обратного вызова (CB ()), где я вызываю далее sendIncommingEvent ().

У меня есть исключение типа "ответ недоступен в этом контексте".

Как сделать объект ответа доступным и в моем обратном вызове? Я нашел грязный обходной путь, чтобы войти в бесконечный цикл после регистрации обработчика событий (см. Еще, где я делаю цикл while (true).)

Это иногда работает хорошо, а иногда это приводит к сбою 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);
            }
        }
    }
}

1 Ответ

0 голосов
/ 04 сентября 2018

Я бы предложил расширить 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);
    }
...