Use the WebSocket factory method instead of WebSocketProtocol (#6646)

- WebSocketProtocol.CreateFromStream makes the netstandard ManagedWebSocket which uses the inefficient versions of Stream overloads.
- Updated the samples to use the new Memory<byte> overloads
This commit is contained in:
David Fowler 2019-01-13 11:05:04 -08:00 committed by GitHub
parent b27739ad3f
commit c528892560
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 12 additions and 13 deletions

View File

@ -51,9 +51,9 @@ namespace EchoApp
private async Task Echo(HttpContext context, WebSocket webSocket, ILogger logger) private async Task Echo(HttpContext context, WebSocket webSocket, ILogger logger)
{ {
var buffer = new byte[1024 * 4]; var buffer = new byte[1024 * 4];
var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); var result = await webSocket.ReceiveAsync(buffer.AsMemory(), CancellationToken.None);
LogFrame(logger, result, buffer); LogFrame(logger, webSocket, result, buffer);
while (!result.CloseStatus.HasValue) while (result.MessageType != WebSocketMessageType.Close)
{ {
// If the client send "ServerClose", then they want a server-originated close to occur // If the client send "ServerClose", then they want a server-originated close to occur
string content = "<<binary>>"; string content = "<<binary>>";
@ -75,19 +75,19 @@ namespace EchoApp
await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None); await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None);
logger.LogDebug($"Sent Frame {result.MessageType}: Len={result.Count}, Fin={result.EndOfMessage}: {content}"); logger.LogDebug($"Sent Frame {result.MessageType}: Len={result.Count}, Fin={result.EndOfMessage}: {content}");
result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); result = await webSocket.ReceiveAsync(buffer.AsMemory(), CancellationToken.None);
LogFrame(logger, result, buffer); LogFrame(logger, webSocket, result, buffer);
} }
await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); await webSocket.CloseAsync(webSocket.CloseStatus.Value, webSocket.CloseStatusDescription, CancellationToken.None);
} }
private void LogFrame(ILogger logger, WebSocketReceiveResult frame, byte[] buffer) private void LogFrame(ILogger logger, WebSocket webSocket, ValueWebSocketReceiveResult frame, byte[] buffer)
{ {
var close = frame.CloseStatus != null; var close = frame.MessageType == WebSocketMessageType.Close;
string message; string message;
if (close) if (close)
{ {
message = $"Close: {frame.CloseStatus.Value} {frame.CloseStatusDescription}"; message = $"Close: {webSocket.CloseStatus.Value} {webSocket.CloseStatusDescription}";
} }
else else
{ {

View File

@ -13,7 +13,6 @@
<Reference Include="Microsoft.AspNetCore.Http.Extensions" /> <Reference Include="Microsoft.AspNetCore.Http.Extensions" />
<Reference Include="Microsoft.Extensions.Logging.Abstractions" /> <Reference Include="Microsoft.Extensions.Logging.Abstractions" />
<Reference Include="Microsoft.Extensions.Options" /> <Reference Include="Microsoft.Extensions.Options" />
<Reference Include="System.Net.WebSockets.WebSocketProtocol" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -159,7 +159,7 @@ namespace Microsoft.AspNetCore.WebSockets
Stream opaqueTransport = await _upgradeFeature.UpgradeAsync(); // Sets status code to 101 Stream opaqueTransport = await _upgradeFeature.UpgradeAsync(); // Sets status code to 101
return WebSocketProtocol.CreateFromStream(opaqueTransport, isServer: true, subProtocol: subProtocol, keepAliveInterval: keepAliveInterval); return WebSocket.CreateFromStream(opaqueTransport, isServer: true, subProtocol: subProtocol, keepAliveInterval: keepAliveInterval);
} }
} }
} }

View File

@ -28,8 +28,8 @@ namespace Microsoft.AspNetCore.WebSockets.Test
return new WebSocketPair( return new WebSocketPair(
serverStream, serverStream,
clientStream, clientStream,
clientSocket: WebSocketProtocol.CreateFromStream(clientStream, isServer: false, subProtocol: null, keepAliveInterval: TimeSpan.FromMinutes(2)), clientSocket: WebSocket.CreateFromStream(clientStream, isServer: false, subProtocol: null, keepAliveInterval: TimeSpan.FromMinutes(2)),
serverSocket: WebSocketProtocol.CreateFromStream(serverStream, isServer: true, subProtocol: null, keepAliveInterval: TimeSpan.FromMinutes(2))); serverSocket: WebSocket.CreateFromStream(serverStream, isServer: true, subProtocol: null, keepAliveInterval: TimeSpan.FromMinutes(2)));
} }
} }
} }