У меня есть страница, ожидающая ответа 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
}
Как я могу написать этот метод для вызова из других классов? Могу ли я использовать поток?
Ваш 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
. Это позволит вам освободить рабочий поток, ожидая уведомления от внешнего источника.
IHttpAsyncHandler
если не хотите убивать свой веб-сервер.