"Microsoft.AspNetCore.WebSockets.Server": "0.1.0-rc2-final"を使用してwebsocketサーバーを作成しますが、動作しません。ASP.NET Core RC2でwebsocketサーバーを作成するには?
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseWebSockets();
app.Use(async (http, next) =>
{
if (http.WebSockets.IsWebSocketRequest)
{
IHandler handler = WebsocketManager.getHandler(http.Request.Path);
if (handler == null)
{
await next();
}
else
{
var webSocket = await http.WebSockets.AcceptWebSocketAsync();
if (webSocket != null && webSocket.State == WebSocketState.Open)
{
// TODO: Handle the socket here.
WebsocketManager.Handle(webSocket, handler);
}
}
}
else
{
// Nothing to do here, pass downstream.
await next();
}
});
app.UseMvc();
}
WebsocketManagerは自分のマネージャークラスです:
は、ここに私のコードです(RC1では、...それは1.0.0-RC1-最終的なもので、それが正常に動作します)。 そして、ここでは、私はWebSocketのセッションを処理する方法である:
public async Task Listen()
{
OnOpen();
while (_webSocket.State == WebSocketState.Open)
{
var error = String.Empty;
try
{
var buffer = new ArraySegment<Byte>(new Byte[4096]);
var received = await _webSocket.ReceiveAsync(buffer, CancellationToken.None);
switch (received.MessageType)
{
case WebSocketMessageType.Close:
OnClose(received.CloseStatus, received.CloseStatusDescription);
break;
case WebSocketMessageType.Text:
var data = Encoding.UTF8.GetString(buffer.Array, buffer.Offset, buffer.Count).Trim('\0');
OnMessage(data);
break;
case WebSocketMessageType.Binary:
OnMessage(buffer.Array);
break;
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
break;
}
}
}
そして、「_webSocket.ReceiveAsync」スローされた例外は、「要求が中止されました。」
私はクライアントがセッションを閉じないと確信しています。
修正方法?
あなたは、ASP.NET CoreでSignalR機能を使用しようとしていますか? –
@JanshairKhanいいえ、私はちょうどゲームサーバーのトランスポート層としてシンプルなwebsocketリスナーを作りたいと思っています。 –
Windows Server 2008 R2以降で開発してテストしていますか?私の知る限り、WebSocketはクライアントOS上でサポートされていません(少なくともWindows 7を含む)。Win8/10についてはわかりません.Windows Server 2008 R2以上が必要です。サポートされていないOSで実行する場合は、長いポーリングまたは同様の手法にフォールバックする必要があります。 WebSocketはどこでもサポートされていないので、SignalRはこれを行います – Tseng