Я много борюсь за реализацию событий сайта сервера для потоковой передачи данных обратно в сборку 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);
}
}
}
}