2016-04-08 9 views
1

私はフレックをあきらめているとの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"を追加しましたか?

+0

どのようにAzureの上には、アプリケーションをホストするのですか? Azureにはいくつかの異なるサービスがあります。 – Hypnobrew

+0

は、Visual Studioから展開された「Azure Webアプリケーションサービス」です。一般的に次のリンク先にあります。https://azure.microsoft.com/en-us/documentation/articles/web-sites-dotnet-get-started/ –

答えて

1

AzureポータルからWebソケットを有効にしましたか?デフォルトでは、AzureはWebソケットを無効にし、サイトの設定で明示的に有効にする必要があります。

portal.azure.comページから、サイトのブレードに移動し、すべての設定 - >アプリケーション設定に移動します。 [Webソケット]で[オン]をクリックします。

次に[保存]をクリックします。

は、詳細についてはこちらをご覧ください:https://azure.microsoft.com/en-us/blog/introduction-to-websockets-on-windows-azure-web-sites/

+0

はい、私はそれをしました。私はその正確なリンクを実際に使っていました –