2016-03-25 14 views
7

Resmi bir belge yokken, SSE'nin ASP.NET Çekirdeği kullanılarak nasıl uygulanabileceğini bilen var mı?ASPNET Core Server Gönderilen Olaylar/Yanıt akışı

Bir uygulamanın özel katman yazılımı kullanabileceğinden şüpheleniyorum, ancak denetleyici eyleminde bunu yapmak da mümkün müdür?

+0

Eğer SignalR söz ediyorsunuz? – Tseng

+0

Hayır, henüz Core için bir Sinyal Yok. – Zygimantas

+0

Nitekim, SignalR 3 hem resmi nuget feed'inde hem de myget ahırlarında https://www.myget.org/gallery/aspnetmaster ve geceliklerde rc1 finalinde mevcuttur. Bu yüzden sordum. Ancak, ASP.NET Core 1.0 yol haritasında belirtildiği gibi piyasaya sürüldüğünde yayınlanmaya hazır olmayacaktır. Https://github.com/aspnet/Home/wiki/Roadmap – Tseng

cevap

24

wwwroot/index.html

, sayfa yüklenirken http://www.somehost.ca/sse url için bir EventSource oluşturun. Ardından olaylarını konsola yazın.

<body> 
    <script type="text/javascript"> 

     var source = new EventSource('sse'); 

     source.onmessage = function (event) { 
      console.log('onmessage: ' + event.data); 
     }; 

     source.onopen = function(event) { 
      console.log('onopen'); 
     }; 

     source.onerror = function(event) { 
      console.log('onerror'); 
     } 

    </script> 
</body> 

Ara Katman

katman sse yolunu işler. Content-Type başlığını, sunucu soketi olayının gerektirdiği text/event-stream olarak ayarlar. Bağlantıyı kapatmadan yanıt akışına yazar. Yazma arasında beş saniye geciktirerek iş yapmayı taklit eder. katman olduğu gibi

app.Use(async (context, next) => 
{ 
    if (context.Request.Path.ToString().Equals("/sse")) 
    { 
     var response = context.Response; 
     response.Headers.Add("Content-Type", "text/event-stream"); 

     for(var i = 0; true; ++i) 
     { 
      // WriteAsync requires `using Microsoft.AspNetCore.Http` 
      await response 
       .WriteAsync($"data: Middleware {i} at {DateTime.Now}\r\r"); 

      response.Body.Flush(); 
      await Task.Delay(5 * 1000); 
     } 
    } 

    await next.Invoke(); 
}); 

Kontrol

kontrol aynı şey yapar. Firefox

yılında

[Route("/api/sse")] 
public class ServerSentEventController 
{ 
    private readonly IHttpContextAccessor _httpContextAccessor; 

    public ServerSentEventController(
     IHttpContextAccessor httpContextAccessor) 
    { 
     _httpContextAccessor = httpContextAccessor; 
    } 

    [HttpGet] 
    public async Task Get() 
    { 
     var response = _httpContextAccessor.HttpContext.Response; 
     response.Headers.Add("Content-Type", "text/event-stream"); 

     for(var i = 0; true; ++i) 
     { 
      await response 
       .WriteAsync($"data: Controller {i} at {DateTime.Now}\r\r"); 

      response.Body.Flush(); 
      await Task.Delay(5 * 1000); 
     } 
    } 
} 

Konsol Çıktı Bu Firefox konsol penceresinde sonucudur. Her beş saniyede yeni mesajlar gelir.

onopen 
onmessage: Message 0 at 4/15/2016 3:39:04 PM 
onmessage: Message 1 at 4/15/2016 3:39:09 PM 
onmessage: Message 2 at 4/15/2016 3:39:14 PM 
onmessage: Message 3 at 4/15/2016 3:39:19 PM 
onmessage: Message 4 at 4/15/2016 3:39:24 PM 

Referanslar:

+1

Teşekkür ederim Shaun, cevabınız çok kapsamlı görünüyor. Yakında itibar puanlarını aktaracağım, hala yerel makinede ve Azure'da RC1 üzerinde yeniden üretme sorunları yaşıyorum. Her yinelemede yanıtın temizlenmediği anlaşılıyor. Belki de RC2'ye geçmek için iyi bir zaman. – Zygimantas

+0

@Zygimantas Öncesi RC2'ye geçmek için iyi bir zaman. Yukarıdakileri RC1'de denemedim. RC2 öncesi ile çalışırken ağrılı olabilirken, acı ile çalışırken büyük miktarda öğreneceksiniz. –

+1

kanayan kenara ittiğin için teşekkür ederim :) Şimdi, RC1'de beklendiği gibi RC2 öncesi çalıştığını teyit edebilirim. – Zygimantas