WebSocket连接失败?

5

我是一个新手,正在尝试使用asp.net通用处理程序和JavaScript WebSocket类创建WebSockets。

JavaScript

<script type="text/javascript">
    window.onload= function () {

        var name = prompt('what is your name?:');            
        var url = 'ws://localhost:5707/ws.ashx?name=' + name;    
        var ws = new WebSocket(url);    
        ws.onopen = function () {
            alert('Connection Opened');
        };
            ws.onmessage = function (e) {
        };
            ws.onclose = function () {
            alert('Connection Close');
        };
            ws.onerror = function (e) {
            alert('Error')
        };

        }

</script>

C#通用处理程序被称为ws.ashx

public class ws : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        if (context.IsWebSocketRequest)
            context.AcceptWebSocketRequest(new TestWebSocketHandler());
    }
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

TestWebSocketHandler类继承自WebSocketHandler类。

   public class TestWebSocketHandler : WebSocketHandler
    {
        private static WebSocketCollection clients = new WebSocketCollection();
        private string name;

        public override void OnOpen()
        {
            this.name = this.WebSocketContext.QueryString["name"];
            clients.Add(this);
            clients.Broadcast(name + " has connected.");
        }

        public override void OnMessage(string message)
        {
            clients.Broadcast(string.Format("{0} said: {1}", name, message));
        }

        public override void OnClose()
        {
            clients.Remove(this);
            clients.Broadcast(string.Format("{0} has gone away.", name));
        }

    }

我的问题是: 当WebSocket打算开启时,我注意到当进入处理程序时
context.IsWebSocketRequest // returns false

然后客户端会报错,错误信息为:

Firefox无法通过ws://localhost:5707/ws.ashx?name=j与服务器建立连接。

接着连接就被关闭了。

我需要知道问题出在哪里?请帮忙查看。

我在Windows 7下使用VS 2013,并且我认为我在使用IIS 6。


你是否使用过 Fiddler 或类似工具来查看发送/接收的内容? - Marc Gravell
没有,但它将如何帮助 - Marwan
实际上,您可能需要使用Firefox工具;切换到网络选项卡,找到Web套接字连接,并查看标头。例如,这是我从此网站(stackoverflow.com)获得的:http://i.stack.imgur.com/goQTY.png - 您在您的网站上得到了什么?另外:在Chrome中是否有效? - Marc Gravell
没有一个前五名的浏览器能够正常运行它 :( - Marwan
2个回答

5
很抱歉,WebSockets只能在运行在Windows 8或Windows 2012的ASP.NET应用程序上工作。尽管API已包含在.NET 4.5.1中,但如果您未使用这些操作系统,则无法使用它。实际上,如果您尝试使用ClientWebSocket,它将抛出PlatformNotSupportedException
如果您无法获得这些操作系统中的任何一个,可以考虑以下替代方案:

也许你是对的,但是你给我的参考资料中使用的这些工具如何处理.Net上的WebSockets呢?另一方面,我使用的是.NET Framework 3.5.1,它不支持WebSockets吗?还是说这与IIS版本有关? - Marwan
1
@Marwan 啊,我没看到 Win 7 - 系统版本很重要;这个使用的 web-sockets 层是内置在 http.sys 中的;但是,如果你真的不能使用不同的操作系统,还有其他可用的 web-sockets API。 - Marc Gravell
2
@vtortola 当然,其中一种选择是使用NLB将发送到Web套接字服务器的请求发送到不同的后端节点。这不是我们自己所做的(我们为Web套接字使用不同的域),但它应该可以工作。 - Marc Gravell
推荐阅读:http://chimera.labs.oreilly.com/books/1230000000545。你可以免费在线阅读这本书。 - vtortola
有一章关于WebSockets的内容非常好:http://chimera.labs.oreilly.com/books/1230000000545/ch17.html 但是你需要先了解一点TCP(书中有很好的介绍)。 - vtortola
显示剩余2条评论

2

可能的原因如下:

  1. 使用 IIS 版本低于 8
  2. 未在 Windows 功能中启用 Web Socket 协议
  3. .NET Framework 版本低于 4.5
  4. 未在 web.config 的 system.webServer 部分包含以下行:
<handlers>
    <add path="/ws.ashx" verb="*" name="ws" type="namespace.ws"/>
</handlers>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接