websocket连接失败?

Posted

技术标签:

【中文标题】websocket连接失败?【英文标题】:websocket connection fails? 【发布时间】:2014-03-31 08:59:32 【问题描述】:

我是 Web 套接字的新手,并尝试使用 asp.net 通用处理程序和 javascript WebSocket 类创建一个

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>

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

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 或类似工具来查看正在发送/接收的内容? 不,但它将如何提供帮助 实际上,您可能需要使用 firefox 工具;切换到网络选项卡,找到网络套接字连接,然后查看标题。例如,这是我的网站 (***.com):i.stack.imgur.com/goQTY.png - 你对你的网站有什么看法?另外:它可以在 Chrome 中使用吗? 不,它适用于非前 5 种浏览器:( 【参考方案1】:

恐怕WebSockets 只能在Windows 8 或Windows 2012 上运行的ASP.NET 应用程序上运行。尽管 API 包含在 .NET 4.5.1 中,但如果您不使用这些操作系统,它将无法工作。实际上,如果你尝试使用ClientWebSocket,它会抛出一个PlatformNotSupportedException

如果您无法获得这些操作系统中的任何一个,您可以检查替代方案:

XSocket.NET:http://xsockets.net/ SuperWebSocket : http://superwebsocket.codeplex.com/ Alchemy Websocket:http://alchemywebsockets.net/ WebSocket 监听器:https://github.com/vtortola/WebSocketListener

【讨论】:

也许你是对的,但是你给我的参考文献中的这些工具是用来处理 .net/ 上的 websockets 的,另一方面,我使用 .net 框架 3.5.1 它不支持吗网络套接字??或者它与 IIS 版本有关?? @Marwan 啊,我没有看到 Win 7 - 重要的是操作系统版本;这个使用的 web-sockets 层被烘焙到 http.sys 中;但是,如果您真的无法使用其他操作系统,则可以使用其他 Web 套接字 API 他们可能都使用普通套接字。我开发了WebSocketListener,它使用普通的TcpListener 来获取Socket 对象并协商WebSocket 会话。我不会在 3.5.1 中工作。新的 http.sys 提供了将普通 HTTP 请求转换为 WebSocket 连接的能力,因此您可以在与网页相同的端口上运行 Websocket。另一方面,我提出的那些替代方案需要作为 IIS 外部的服务在不同的端口中运行。 MS 表示这是一个太大的变化,无法在 Windows 7 或 Windows Server 2008 中引入它。 @vtortola 当然,一种选择是简单地使用 NLB 将发往 web-socket 服务器的请求发送到不同的后端节点。不是我们自己做的(我们为 web-sockets 使用不同的域),但它应该可以工作。 我已经走得太远了,我无法理解它我认为我需要对网络进行一些研究,并深入了解 Windows 端口和类似的东西,所以建议任何参考【参考方案2】:

原因可能是以下任何一种:

    拥有 IIS 版本 Windows 功能下未启用 Web Socket 协议 拥有 .NET Framework 版本 web.config 的system.webServer 部分中未包含以下行:
<handlers>
    <add path="/ws.ashx" verb="*" name="ws" type="namespace.ws"/>
</handlers>

【讨论】:

以上是关于websocket连接失败?的主要内容,如果未能解决你的问题,请参考以下文章

抑制“与 'xyz' 的 WebSocket 连接失败”

WebSocket 连接失败。 WebSocket握手期间出错-socketjs

websocket连接失败?

WebSocket 连接到 'ws:url' 失败:WebSocket 在连接建立之前关闭

Websocket 连接尝试失败,返回“连接:升级,关闭”。

rxjs/webSocket - 到“ws://localhost:3000/”的 WebSocket 连接失败:连接在收到握手响应之前关闭