2013-11-21 60 views
1

我想在這裏做的例子: http://www.codeguru.com/csharp/csharp/programming-html5-web-sockets-in-asp.net-4.5.htm(但有一點扭曲,我使用MVC控制器作爲柵極建立網絡套接字連接)使用WebSockets到Windows Azure的連接使用MVC控制器

這是我在mvc4控制器:

public class HandleWSController : Controller 
{ 
    // 
    // GET: /HandleWS/ 

    public ActionResult Index() 
    { 
     if (ControllerContext.HttpContext.IsWebSocketRequest) 
     { 
      Trace.WriteLine("Inside IsWebSocketRequest check"); 
      ControllerContext.HttpContext.AcceptWebSocketRequest(DoTalking);     
     } 


     return View(); 
    } 

    public async Task DoTalking(AspNetWebSocketContext context) 
    { 
     Trace.WriteLine("Inside DoTalking"); 
     WebSocket socket = context.WebSocket; 
     while (true) 
     { 
      var buffer = new ArraySegment<byte>(new byte[1024]); 
      WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None); 
      Trace.WriteLine("Result: " + result.ToString()); 
      Trace.WriteLine("State: " + socket.State.ToString()); 
      if (socket.State == WebSocketState.Open) 
      { 
       string userMessage = Encoding.UTF8.GetString(buffer.Array, 0, result.Count); 
       userMessage = "You sent: " + userMessage + " at " + DateTime.Now.ToLongTimeString(); 
       Trace.WriteLine(userMessage); 
       buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(userMessage)); 
       await socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None); 
      } 
      else 
      { 
       break; 
      } 
     } 
    } 


} 

這是我的看法從我嘗試連接:

<h2>Index</h2> 
<input type="text" id="txtMsg" placeholder="Write your message here" /><input type="submit" id="btnSend" value="Send" /><input type="submit" id="btnStop" value="Stop" /> 

<div id="divHistory"> 

</div> 
<script> 

var socket; 
$(document).ready(function() { 
    socket = new WebSocket("ws://wstester.azurewebsites.net/HandleWS/Index"); 
    socket.onopen = function (evt) { 
     $("#divHistory").html('<h3>Connection Opened with the Echo server.</h3> '); 
    } 
    socket.onmessage = function (evt) { 
     $("#divHistory").html('<h3>' + evt.data + '</h3> '); 
    } 
    socket.onerror = function (evt) { 
     $("#divHistory").html('<h3>Unexpected Error.</h3> '); 
    } 
}); 



$("#btnSend").click(function() { 
    if (socket.readyState == WebSocket.OPEN) { 
     socket.send($("#txtMsg").val()); 
    } 
    else { 
     $("#divHistory").append('<h3>The underlying connection is closed.</h3> '); 
    } 
}); 


$("#btnStop").click(function() { 
    socket.close(); 
}); 
</script> 

正如你可以看到我心中已經e一直在試圖用trace來找出錯誤。記錄「內部IsWebSocketRequest檢查」記錄,但DoTalking方法內部的跟蹤不是。

當我嘗試運行它時,出現「底層連接已關閉」消息。 Web站點在Azure上啓用。我不知道端口,但後來因爲我在mvc中使用控制器,我想80端口應該是默認的。我的老師對此進行了快速瀏覽,無法弄清楚問題所在。

任何幫助或指針,將不勝感激!

+0

任何你希望我加入到這個問題,缺什麼嗎? –

回答

0

替換指數方法的最後一行到return new HttpStatusCodeResult(HttpStatusCode.SwitchingProtocols);

public ActionResult Index() 
{ 
    if (ControllerContext.HttpContext.IsWebSocketRequest) 
    { 
     Trace.WriteLine("Inside IsWebSocketRequest check"); 
     ControllerContext.HttpContext.AcceptWebSocketRequest(DoTalking); 
    } 
    return new HttpStatusCodeResult(HttpStatusCode.SwitchingProtocols); 
} 
+0

試過了,現在還是不行。 –

+0

該解決方案有效。看到這個:http://meegoreng.azurewebsites.net/。我在http://wstester.azurewebsites.net/看到了你的解決方案,發現你的WebSocket試圖連接到localhost,而不是azure網站!另外,重新檢查您是否啓用了天藍色的websockets。 – LostInComputer

+0

你可以在我的測試網站meegoreng.azurewebsites.net下載源代碼。 – LostInComputer