2017-01-08 14 views
1

После нескольких часов поиска в Google я нашел только один пример источника события, использующего для asp.net (Not MVC). Во-первых, я должен сказать, что хочу изучить его, и моя конечная цель - создать дружественный покерный сайт. SignalR очень очень хорошо для моей цели, но я не хочу использовать это, потому что я слышал:Источник события в asp.net имеет ответ с одной задержкой поворота

SignalR плохо в исполнении

является не (я надеюсь, что нет?). Моя проблема в том, когда сервер отправляет ответ клиенту он посылает предыдущий текст не ток:

$("#btnListen").click(function() 
     { 
      var source = new EventSource('SSEHandler.ashx'); 
      source.addEventListener("open", function (event) 
      { 
       $('#headerDiv').append('Latest 5 values'); 
      }, false); 
      source.addEventListener("error", function (event) 
      { 
       if (event.eventPhase == EventSource.CLOSED) 
       { 
        $('#footerDiv').append('Connection Closed!'); 
       } 
      }, false); 
      source.addEventListener("message", function (event) 
      { 
       console.log(event.data);     
      }, false); 
     }); 

И это SSEHandler:

public class SSEHandler : IHttpHandler 
{ 
    public bool IsReusable 
    { 
     get { return true; } 
    }  

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

     Response.Write(string.Format("data: {0}\n\n", "first")); 
     Response.Flush(); //client has no response received yet 
     Response.Write(string.Format("data: {0}\n\n", "second")); 
     Response.Flush(); //now client get "first".    
     Response.Close(); 

    } 
} 

После выполнения этого треска консоль клиента только «первый». И если я добавить это в конце SSEHandler:

Response.Write(string.Format("data: {0}\n\n", "third")); 
Response.Flush(); 

В консоли клиента есть «первая», «Второй». Спасибо, что прочитал мой длинный пост.

+0

попробуйте сигналR и посмотрите, достаточно ли он для вашего проекта. код выше выглядит хорошо, возможно, пробовал комментарий до закрытия() ing ... – dandavis

+0

Спасибо @dandavis. Как я могу проверить SignalR на 40 человек, используя его в одно и то же время? И не могли бы вы объяснить больше, чтобы добавить комментарий перед закрытием? –

+0

комментарий, такой как keep-alive, может заставить клиента засеять все отправленные данные. я не знаю, как протестировать 40 одновременно, возможно, запустил 8 вкладок на 5 компьютеров? – dandavis

ответ

0

Это было какое-то время с тех пор, как вы задали вопрос, но после того, как я боролся с этим какое-то время, я нашел обходное решение, которое, как я думал, может быть полезным для других, имеющих ту же проблему.

Просто добавьте комментарий (строка, начинающаяся с двоеточия) после каждого события, чтобы события появлялись, когда они должны были.

Response.Write("data: first\n\n") 
Response.Write(":comment\n") 
Response.Write("data: second\n\n") 
Response.Write(":comment\n") 

Примечание: Проблема заключается в более очевидной при работе с событиями, которые приходит динамически, так как в этот момент первое событие обыкновение производить что-либо на клиенте, а затем, когда ударяет второе событие, первый отображается в клиенте , И это продолжается со вторым и третьим и т. Д.