使用MVC控制器将websockets连接到windows azure
我试图在这里做一个例子: http : //www.codeguru.com/csharp/csharp/programming-html5-web-sockets-in-asp.net-4.5.htm (但有点扭曲,我用MVC控制器作为建立Web套接字连接的门户)
这是我在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(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(Encoding.UTF8.GetBytes(userMessage)); await socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None); } else { break; } } } }
这是我尝试连接的视图:
Index
var socket; $(document).ready(function () { socket = new WebSocket("ws://wstester.azurewebsites.net/HandleWS/Index"); socket.onopen = function (evt) { $("#divHistory").html('Connection Opened with the Echo server.
'); } socket.onmessage = function (evt) { $("#divHistory").html('' + evt.data + '
'); } socket.onerror = function (evt) { $("#divHistory").html('Unexpected Error.
'); } }); $("#btnSend").click(function () { if (socket.readyState == WebSocket.OPEN) { socket.send($("#txtMsg").val()); } else { $("#divHistory").append('The underlying connection is closed.
'); } }); $("#btnStop").click(function () { socket.close(); });
正如您所看到的,我一直在尝试使用跟踪来查找错误。 记录了“Inside IsWebSocketRequest check”跟踪,但DoTalking方法中的跟踪不是。
当我尝试运行它时,我收到“基础连接已关闭”消息。 在azure上为此网站启用了Web套接字。 我不知道端口但是因为我在mvc中使用控制器我认为端口80应该是默认的。 我的老师快速浏览了一下,无法弄清问题是什么。
任何帮助或指针将不胜感激!
替换Index方法中的最后一行以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); }