Как создать метод для отправки данных в режиме реального времени с использованием универсального обработчика?

1

У меня есть страница, ожидающая ответа Generic Handler с этим кодом javascript:

if (typeof (EventSource) !== "undefined") {
var source = new EventSource("../Handler/EventHandler.ashx");
source.onmessage = function (event) {
    alert(event.data);
   };
} 

и этот обработчик:

public void ProcessRequest(HttpContext context)
{
        context.Response.ContentType = "text/event-stream";
        context.Response.Write("data: Event handler started");
        context.Response.Flush();
        context.Response.Close();
}

Теперь я хочу иметь метод (в обработчике), например, чтобы отправить некоторые данные в режиме реального времени через ashx на мою страницу:

public void send(string data){
    //send through ashx
}

Как я могу написать этот метод для вызова из других классов? Могу ли я использовать поток?

  • 0
    Это именно то, что SignalR предназначен для решения.
Теги:
real-time
response
generic-handler

1 ответ

2
Лучший ответ

Ваш ProcessRequest сервер метод стороны никогда не должен заканчиваться:

public void ProcessRequest(HttpContext context)
{
    Response.ContentType = "text/event-stream";

    var source = new SomeEventSource();
    source.OnSomeEvent += data =>
    {
        context.Response.Write(data);
        context.Response.Flush();
    }

    while (true)
    {
        System.Threading.Thread.Sleep(1000);
    }

    Response.Close();
}

Это говорит о том, что использование цикла блокировки навсегда в методе ProcessRequest будет ужасным с точки зрения потребления ресурсов. Вы должны абсолютно рассмотреть возможность использования IHttpAsyncHander вместо IHttpHandler. Это позволит вам освободить рабочий поток, ожидая уведомления от внешнего источника.

  • 0
    Я не хочу использовать постоянную проверку, поскольку я использую Quartz.net для запуска новых событий. Возможно ли это без проверки?
  • 0
    Отлично, тогда просто подпишитесь на соответствующие события, которые предоставляет вам Quartz.NET. Важно то, что вы не должны возвращаться из метода ProcessRequest. Это должно работать вечно. Также убедитесь, что вы используете IHttpAsyncHandler если не хотите убивать свой веб-сервер.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню