public HandleSocket ( HttpContext http ) : Task | ||
http | HttpContext | |
Résultat | Task |
public async Task HandleSocket(HttpContext http)
{
var webSocket = await http.WebSockets.AcceptWebSocketAsync();
_sockets.Add(webSocket);
while (webSocket.State == WebSocketState.Open)
{
var token = CancellationToken.None;
var buffer = new ArraySegment<Byte>(new Byte[100000]);
var received = await webSocket.ReceiveAsync(buffer, token);
var json = buffer.ReadString(received);
if (received.EndOfMessage)
{
if (json.IsNotEmpty())
{
Received(json);
}
}
else
{
var builder = new StringBuilder(json);
while (!received.EndOfMessage)
{
received = await webSocket.ReceiveAsync(buffer, token);
json = buffer.ReadString(received);
builder.Append(json);
}
Received(builder.ToString());
}
}
_sockets.Remove(webSocket);
webSocket.Dispose();
}
private void startWebServer(int port, WebSocketsHandler webSockets) { var baseDirectory = AppContext.BaseDirectory; var host = new WebHostBuilder() .UseKestrel() .UseContentRoot(baseDirectory) .UseUrls($"http://localhost:{port}") .Configure(app => { app.UseWebSockets(); app.Use(async (http, next) => { if (http.WebSockets.IsWebSocketRequest) await webSockets.HandleSocket(http).ConfigureAwait(false); else await next().ConfigureAwait(false); }); #if DEBUG configureStaticFiles(app); #endif app.Run(async http => { if (http.Request.Path == "/favicon.ico") { var stream = GetType() .GetTypeInfo() .Assembly.GetManifestResourceStream("StorytellerRunner.favicon.ico"); http.Response.ContentType = "image/x-icon"; await stream.CopyToAsync(http.Response.Body).ConfigureAwait(false); return; } try { string html; if (http.Request.Path.HasValue && http.Request.Path.Value == "/preview") { html = ExportWriter.BuildPage(_application); } else { html = HomeEndpoint.BuildPage(_application, _input).ToString(); } http.Response.ContentType = "text/html"; await http.Response.WriteAsync(html).ConfigureAwait(false); } catch (Exception e) { Console.WriteLine(e.ToString()); throw; } }); }); _server = host.Start(); }