私はフレックをあきらめているとのWebSocket接続を自分自身を処理することを決定したUPDATEアズール/ローカルASP.NET 5のWebSocketのトラブルシューティング
。私は以下のコードを更新しました。この質問はAzureについてはあまり分かりませんが、ASP.NET 5/Middlewares /などに加えられた変更に関連しているので、まだ「トピック」になっていると感じています。 Azureへの展開に不注意に影響します。
問題:以下のコードでは、WebSocket接続を正常に開いて、作成時に「ping」というテキストメッセージをブラウザコンソールに表示します。問題は、接続がまだ開いているにもかかわらず、追加のメッセージを送信しようとする試みがうまくいかないことです。この問題は、ローカルおよびAzureで発生します。
Startup.cs - 私はWebSocketのミドルウェア
public class Startup
{
public static List<WebSocket> allSockets = new List<WebSocket>();
/* Redis PUB/SUB is where I SendAsync to my websocket(s) */
static ConnectionMultiplexer conRedis = ConnectionMultiplexer.Connect(
"connection string here, non local redis instance");
static ISubscriber sub = conRedis.GetSubscriber();
...
...
/*New WebSockets middleware*/
app.UseWebSockets();
/*Basic websocket handler, stolen from blog, will link*/
app.Use(async (http, next) =>
{
if (http.WebSockets.IsWebSocketRequest)
{
var webSocket = await http.WebSockets.AcceptWebSocketAsync();
if (webSocket != null && webSocket.State == WebSocketState.Open)
{
// TODO: Handle the socket here.
System.Diagnostics.Debug.WriteLine("Adding to List");
allSockets.Add(webSocket);
/* This send works */
await webSocket.SendAsync(
new ArraySegment<byte>(Encoding.UTF8.GetBytes("Ping")), WebSocketMessageType.Text, true, CancellationToken.None);
}
}
else
{
// Nothing to do here, pass downstream.
await next();
}
});
/*Routes here*/
app.UseMvc(routes =>
{
...
...
}
...
public static void Main(string[] args)
{
/* This is from StackExchange.Redis package */
/* I need the PUB/SUB functionality */
sub.Subscribe("msg", async (channel, msg) =>
{
var data = Encoding.UTF8.GetBytes(msg);
var buffer = new ArraySegment<byte>(data);
var token = CancellationToken.None;
/* Doesn't work */
await Task.WhenAll(allSockets.Where(s=>s.State == WebSocketState.Open)
.Select(s => s.SendAsync(buffer, WebSocketMessageType.Text, true, token)));
/* Doesn't work */
foreach (var s in allSockets)
await s.SendAsync(buffer, WebSocketMessageType.Text, true, token);
}
WebApplication.Run<Startup>(args);
}
関連のJavascript
var wsImpl = window.WebSocket || window.MozWebSocket;
window.socket = new wsImpl('ws://mysitehere.azurewebsites.net/sock');
socket.onopen = function() { console.log("Connection opened"); };
socket.onclose = function() { console.log("Connection closed"); };
/* Logs 'Ping' */
socket.onmessage = function (msg) { console.log(msg);};
に任意のアイデアを公開したパッケージ"Microsoft.AspNet.WebSockets.Server"
を追加しましたか?
どのようにAzureの上には、アプリケーションをホストするのですか? Azureにはいくつかの異なるサービスがあります。 – Hypnobrew
は、Visual Studioから展開された「Azure Webアプリケーションサービス」です。一般的に次のリンク先にあります。https://azure.microsoft.com/en-us/documentation/articles/web-sites-dotnet-get-started/ –