【问题标题】:websocket connection fails?websocket连接失败?
【发布时间】: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 工具;切换到网络选项卡,找到网络套接字连接,然后查看标题。例如,这是我的网站 (stackoverflow.com):i.stack.imgur.com/goQTY.png - 你对你的网站有什么看法?另外:它可以在 Chrome 中使用吗?
  • 不,它适用于非前 5 种浏览器:(

标签: c# javascript asp.net websocket


【解决方案1】:

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

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

【讨论】:

  • 也许你是对的,但是你给我的参考文献中的这些工具是用来处理 .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】:

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

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

【讨论】:

    猜你喜欢
    • 2018-12-19
    • 2022-10-17
    • 2016-04-20
    • 2013-12-17
    • 2016-05-13
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多