web-dev-qa-db-ja.com

Webソケットを使用したSignalR

私は開発環境でwebsocketを動作させようとしています:

  • Visual Studio 2010
  • Windows 7
  • シグナルR 0.51
  • 最新Chrome/Firefox

残念ながら、Javscriptクライアントは長いポーリングを使用しています。クライアント側でWebソケットを強制すると、まったく接続できません。

$.connection.hub.start({ transport: ['webSockets'] })

サーバーコードは自己ホスト型で、サンプルに基づいており、次のようになります。

static void Main(string[] args)
{
    string url = "http://localhost:8081/";
    var server = new Server(url);

    // Map the default hub url (/signalr)
    server.MapHubs();

    // Start the server
    server.Start();

    Console.WriteLine("Server running on {0}", url);

    // Keep going until somebody hits 'x'
    while (true)
    {
        ConsoleKeyInfo ki = Console.ReadKey(true);
        if (ki.Key == ConsoleKey.X)
        {
            break;
        }
    }
}

public class MyHub : Hub
{            
    public void Send(string message)
    {
        Clients.addMessage(message);
    }
}

私は周りを検索しましたが、決定的なものは何も見つかりませんでした。いくつかの特別なものを指定する必要がありますか、Visual Studio 2012を使用しますか、それともWindows 8でのみ動作しますか= IIS 8?

29
Luke Belbina

この回答に基づいて https://stackoverflow.com/a/9135334/700926 SignalRでのWebSocketサポートはWindows 8/IIS8に依存していることがわかります-回答はまたSignalRのgithubページにあるwikiページですが、そのページはもう存在しません。

しかし、githubでウィキリポジトリを複製し、いくつかのリビジョンに戻ると、SignalR.WebSockets SignalRのgithubページによると、もはや存在しないプロジェクト-(これは、wikiサイトが削除される理由を説明するかもしれません)-ただし、SignalR.WebSockets今年2月から、次のように述べました。

SignalR.WebSockets パッケージを既存のSignalRプロジェクトに追加して、クライアントが WebSocketプロトコルを使用して接続できるようにすることができます 。 SignalR jQueryクライアントは(ブラウザーがサポートしている場合)WebSocketを介して自動的に接続を試みるため、WebSocketをSignalRベースのアプリケーションに追加するためにクライアント側で変更する必要はありません。

SignalR.WebSocketsは、ASP.NET内からの着信WebSocket接続をリッスンするために Microsoft.WebSockets に依存しています。このパッケージは、ASP.NET 4.5およびIIS 8.0に追加された新しいWebSocketsサポートに依存しています。その結果、SignalR.WebSocketsパッケージはWindows 8マシン(。 NET 4.5は以前のバージョンのWindowsにインストールされますが、IIS 8.0)にはWindows 8が必要です。Windows8マシンのセットアップ方法の詳細(開発者プレビューを使用)は、 こちら

上記で提供したものよりも新しい情報を検索しようとしましたが、私が知る限り、SignalR wikiは現在のバージョンではこのトピックを明示的にカバーしていません。

23

Windows 8/.NET 4.5でも最初は機能していませんでしたが、これらの追加のヒントでついに機能しました。

  • Websocketサポートをインストールする

    -> Turn Windows features on or off
    -> Internet Information Services 
    -> World Wide Web Services 
    -> Application Development Features 
    -> WebSocket Protocol
    
  • web.configのappSettingsで、この設定を追加します。

    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
    

SignalRは自動的にwebsocketをネゴシエートします。指定する必要はなく、コードには特別なものは必要ありません。

56
Maarten

Signal Rは、Windows 7、IIS 7.5およびVisual Studio 2012でも動作します。唯一の欠点は、トランスポートプロトコルとしてlongPollingを使用することです。

上記の構成でsignalRを正常に使用するには、いくつかの設定を行う必要がありますが、実際にはsignalRチュートリアルでは詳しく説明していません。

そのため、サーバー側(win 7、IIS 7.5)では、接続とプロキシを作成するときに、次のような操作を行う必要があります。

Connection = new HubConnection('someUrl', false);   
Proxy = Connection.CreateHubProxy('myHubProxy');   
Connection.Start(new LongPollingTransport()).Wait(); // notice the specification of transport

もちろん、クライアント側でも同じように、トランスポートプロトコルを「longPooling」として指定する必要があります。

var connection = $.hubConnection('myUrl', { useDefaultPath: false });
connection.start({ transport: ['websockets', 'longPolling'], jsonp: true, xdomain: true })
1
Leo

SignalRのWebSocketの問題をトラブルシューティングするための上記のソリューションに加えて、企業ネットワーク(または同様に構成されたもの)内にいる場合、プロキシとファイアウォールがハンドシェイクに干渉する可能性があります。

ただし、SSLを介してアクセスする場合、多くの場合、提供するラッパーがこの干渉から保護します。

0
Bon