// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); services.AddSingleton(provider => new Lazy <ThreadPoolLogger>(() => { var threadPoolLogger = new ThreadPoolLogger(); threadPoolLogger.Start(); return(threadPoolLogger); })); var rootUri = Configuration.GetValue <string>("RootUri") ?? throw new ArgumentNullException("RootUri"); services.AddHttpClient("someapi", client => { client.BaseAddress = new Uri(rootUri); }); }
//Asynchronous request handler. public async Task WebSocketRequestHandler(ThreadPoolLogger threadPoolLogger, WebSocket webSocket) { JsonSerializer js = new JsonSerializer(); /*We define a certain constant which will represent * size of received data. It is established by us and * we can set any value. We know that in this case the size of the sent * data is very small. */ const int maxMessageSize = 1024; //Buffer for received bits. var receivedDataBuffer = new ArraySegment <Byte>(new Byte[maxMessageSize]); var cancellationToken = new CancellationToken(); //Checks WebSocket state. while (webSocket.State == WebSocketState.Open) { using (MemoryStream ms = new MemoryStream()) using (StreamWriter sm = new StreamWriter(ms)) using (JsonWriter jw = new JsonTextWriter(sm)) { var stats = await threadPoolLogger.SourceBlock.ReceiveAsync(cancellationToken); stats.Error = threadPoolLogger.Error; js.Serialize(jw, stats); jw.Flush(); //Sends data back. await webSocket.SendAsync(new ArraySegment <byte>(ms.ToArray()), WebSocketMessageType.Text, true, cancellationToken).ConfigureAwait(false); await Task.Delay(100).ConfigureAwait(false); } } }