IsCancellationRequested => Request cancelled (eg when closing browser tab)
NoContent => No Status change
HttpStatusCode.OK => Status changed
SignalWaiter => Search for SignalWaiter in posts
[HttpGet] [Route("api/freightregistrations/{freightRegistrationId}/watch/{appStatusId}")] //[ApiCallRight("api.freightregistrations.getById")] [AllowAnonymous] public async Task<HttpResponseMessage> WatchById(Guid freightRegistrationId, int appStatusId) { var cancellationToken = Request.GetOwinContext()?.Request?.CallCancelled ?? default(CancellationToken); var freightRegistration = await DomainPorts.FreightRegistrationStore.GetById(freightRegistrationId); if (freightRegistration == null) return Request.CreateResponse(HttpStatusCode.NotFound); var appStatus = freightRegistration.GetAppStatus(); if ((int)appStatus != appStatusId) { return Request.CreateResponse(HttpStatusCode.OK, new VmStatusChange((int)appStatus, appStatus.ToString())); } try { var key = $"registration|{freightRegistrationId}"; using (var signalWaiter = new SignalWaiter(key, TimeSpan.FromSeconds(60), cancellationToken)) { await signalWaiter.Wait(); if (cancellationToken.IsCancellationRequested) return Request.CreateResponse(HttpStatusCode.NoContent); freightRegistration = await DomainPorts.FreightRegistrationStore.GetById(freightRegistrationId); if (freightRegistration == null) return Request.CreateResponse(HttpStatusCode.NotFound); appStatus = freightRegistration.GetAppStatus(); if ((int)appStatus != appStatusId) { return Request.CreateResponse(HttpStatusCode.OK, new VmStatusChange((int)appStatus, appStatus.ToString())); } } } catch (TimeoutException) { // ignore } return Request.CreateResponse(HttpStatusCode.NoContent); } // Somewhere: SignalWaiter.SendSignal($"registration|{freightRegistrationId}");
387600cookie-checkC# Long-Polling Api Call