public EventsController() { _timer = _timer ?? new Timer((s) => { _timer.Change(Timeout.Infinite, Timeout.Infinite); using (var context = new ImageEntryContext()) { foreach (var c in _clients) { try { var image = context.Images.Include(i => i.Comments).First(i => i.Id == c.ImageId); var lastComments = image.Comments.Where(comment => comment.Id > c.LastMessage); if (lastComments.Any()) { c.StreamWriter.WriteLine("data:" + JsonConvert.SerializeObject(lastComments.ToArray())); c.StreamWriter.WriteLine(); c.StreamWriter.Flush(); c.LastMessage = lastComments.Max(lc => lc.Id); } c.StreamWriter.WriteLine("data:" + JsonConvert.SerializeObject(new { Likes = image.Likes })); c.StreamWriter.WriteLine(); c.StreamWriter.Flush(); } catch { _clients = new ConcurrentQueue <Client>(_clients.Where(client => client != c)); } } } _timer.Change(1000, 1000); }, null, 0, 1000); }
public ActionResult Image(int id, string username, string comment) { var c = new Comment() { Content = comment, User = username }; ImageEntry image; using (var context = new ImageEntryContext()) { image = context.Images.Include(i => i.Comments).First(i => i.Id == id); image.Comments.Add(c); context.SaveChanges(); } return(View(image)); }
public HttpResponseMessage Get(HttpRequestMessage request, int id) { int lastCommentId = 0; using (var context = new ImageEntryContext()) { lastCommentId = context.Images.Include(i => i.Comments).First(i => i.Id == id).Comments.Max(c => c.Id); } var client = new Client() { ImageId = id, LastMessage = lastCommentId }; var response = request.CreateResponse(); response.Content = new PushStreamContent((s, c, t) => { var writer = new StreamWriter(s); client.StreamWriter = writer; _clients.Enqueue(client); }, "text/event-stream"); return(response); }