2016-08-30 11 views
0

サーバー側でGETメソッドを開くと、websocketが別のWebサーバーに開き、クライアントと他のサーバー間の単純なゲートウェイとして機能します。.NETのチェーン2 Webソケット(asp.net 4.5を使用)

クライアントと最初のWebサーバーの間でwebsocketを取得するのは簡単ですが、別のWebサーバーを簡単に開き、メッセージを転送する方法がわかりません。私は、クライアントがその時点で抱いていることを聞く必要もないことに注意してください。すべてのメッセージは、2番目のWebサーバーから送信されます。

+0

これは、MITM攻撃の仕組みです。 Googleで詳しく調べてみましょう。何も見つからなければ、私に知らせてください。私はいくつかのサンプルアプリケーションを書いてここに投稿します。 –

+0

Ok :-)私はグーグルでしたが、別のwebsocketからのメッセージをクライアントが開いたwebsocketにプッシュする方法を見つけるのが難しいです。クライアントが接続を閉じたときに内部WebSocketを閉じたいとは言いません。それが役に立ったら、すでに持っているスケルトンコードを置くことができます。 – CanardMoussant

+0

サーバー上に新しいソケットを開き、メッセージが受信されると、この新しいソケットはそのメッセージを前方に送信します。開いているソケットのイベント/例外に基づいて、このソケットを閉じます。 –

答えて

1

私は次のようなコードを書くことができました。ここで質問したので、私は自分のコードを投稿します。どんなコメントでも大歓迎です。

[Route("api/{slip}")] 
[HttpGet] 
public async Task<IHttpActionResult> TrackJob(String slip) 
{ 
    var serverEndpoint = string.Format("ws://{0}/api/services", slip); 

    HttpContext currentContext = HttpContext.Current; 
    if (currentContext.IsWebSocketRequest) 
    { 
     try 
     { 
      currentContext.AcceptWebSocketRequest(GetWebSocketSession(serverEndpoint)); 
      return ResponseMessage(Request.CreateResponse(HttpStatusCode.SwitchingProtocols)); 
     } 

     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 
      throw ex; 
     } 
    } 
    else 
    { 
     return NotFound(); 
    } 
} 

private Func<AspNetWebSocketContext, Task> GetWebSocketSession(String serverEndpoint) 
{ 
    Func<AspNetWebSocketContext, Task> func = async (context) => 
    { 
     var wsToClient = context.WebSocket; 

     using (var wsToProcessingCluster = new ClientWebSocket()) 
     { 
      new Task(async() => 
      { 
       var inputSegment = new ArraySegment<byte>(new byte[1024]); 

       while (true) 
       { 
        // MUST read if we want the state to get updated... 
        try 
        { 
         await wsToClient.ReceiveAsync(inputSegment, CancellationToken.None); 
        } 

        catch (Exception ex) 
        { 
         Console.WriteLine(ex); 
         return; 
        } 

        if (wsToClient.State != WebSocketState.Open) 
        { 
         await wsToProcessingCluster.CloseAsync(WebSocketCloseStatus.Empty, "", CancellationToken.None); 
         break; 
        } 
       } 
      }).Start(); 

      var buffer = new byte[1024]; 
      var uri = new Uri(serverEndpoint); 
      await wsToProcessingCluster.ConnectAsync(uri, CancellationToken.None); 
      while (true) 
      { 
       if (wsToClient.State != WebSocketState.Open) 
       { 
        break; 
       } 
       else 
       { 
        var segment = new ArraySegment<byte>(buffer); 
        var result = await wsToProcessingCluster.ReceiveAsync(segment, CancellationToken.None); 

        await wsToClient.SendAsync(segment, result.MessageType, result.EndOfMessage, CancellationToken.None); 
       } 
      } 
     } 
    }; 

    return func; 
} 
関連する問題