예제 #1
0
        private async Task <ITransport> AcceptWebSocketAsync(HttpListenerContext httpListenerContext)
        {
            try
            {
                if (!httpListenerContext.Request.IsWebSocketRequest)
                {
                    httpListenerContext.Response.StatusCode = 400;
                    httpListenerContext.Response.Close();
                    return(null);
                }

                var context = await httpListenerContext.AcceptWebSocketAsync(
                    LimeUri.LIME_URI_SCHEME, _bufferSize, _keepAliveInterval)
                              .WithCancellation(_acceptTransportCts.Token)
                              .ConfigureAwait(false);

                return(new ServerWebSocketTransport(context, _envelopeSerializer, _traceWriter, _bufferSize));
            }
            catch (OperationCanceledException) when(_acceptTransportCts.IsCancellationRequested)
            {
            }
            catch (Exception ex)
            {
                ListenerException.RaiseEvent(this, new ExceptionEventArgs(ex));
            }

            return(null);
        }
예제 #2
0
        private async Task AcceptTransportsAsync()
        {
            while (!_acceptTransportCts.IsCancellationRequested)
            {
                try
                {
                    var httpContext = await _httpListener
                                      .GetContextAsync()
                                      .WithCancellation(_acceptTransportCts.Token)
                                      .ConfigureAwait(false);

                    await _httpListenerContextBufferBlock
                    .SendAsync(httpContext, _acceptTransportCts.Token)
                    .ConfigureAwait(false);
                }
                catch (OperationCanceledException) when(_acceptTransportCts.IsCancellationRequested)
                {
                    break;
                }
                catch (Exception ex)
                {
                    var args = new ExceptionEventArgs(ex);
                    ListenerException.RaiseEvent(this, new ExceptionEventArgs(ex));
                    await args.WaitForDeferralsAsync();
                }
            }
        }