【问题标题】:WebSocket handshake failed between JavaScript Client and WCF ServiceJavaScript 客户端和 WCF 服务之间的 WebSocket 握手失败
【发布时间】:2017-07-27 13:44:44
【问题描述】:

我有一个以前使用 wsDualHttpBinding 的现有双工 WCF Web 服务。我正在尝试将其切换到 Web Sockets (netHttpBinding),以便可以通过 Web 浏览器客户端使用它。

尝试实例化 WebSocket 对象时出现以下错误:

WebSocket connection to 'ws://localhost:8888/CallbackService' failed: Error 
during WebSocket handshake: Unexpected response code: 400

WCF 配置:

<system.serviceModel>
<services>
  <service name="CallbackTestWebService">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8888" />
      </baseAddresses>
    </host>
    <endpoint address="CallbackService" binding="netHttpBinding" contract="CallbackTestWebService" />
    <endpoint address="http://localhost:8888/mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>
</system.serviceModel>

JS代码:

var url = 'ws://localhost:8888/CallbackService';
var socket = new WebSocket(url); // error

我已启用 WCF 跟踪 - 日志显示正在接收的字节但没有错误。开发工具中的 websocket 升级请求显示 Bad Request 响应,表示升级不成功。这是在装有 IIS 8 的 Windows 10 机器上,我检查了 WebSocket 协议启用。

Web 服务确实与 .NET 控制台客户端(使用 DuplexChannelFactory&lt;&gt;)一起工作。我只在浏览器中使用 JS WebSocket 得到这个错误。

来自开发工具的请求/响应跟踪:

如何解决或获取有关此错误的更多信息?

【问题讨论】:

  • 您尝试连接到端口 8888 但来源是 1646?
  • localhost:8888 是运行 Web 服务的位置,localhost:1646 是为客户端页面提供服务的 Web 服务器。这是一个跨域问题吗?
  • 检查是否可以使用 ip 而不是 localhost 进行连接。例如 ws://192.168.0.1:8888/CallbackService
  • @Luke 恐怕同样的错误,

标签: javascript wcf websocket


【解决方案1】:

这花了我相当多的时间来弄清楚。按照这个例子,我终于可以让它工作了。 https://www.codeproject.com/Articles/619343/Using-WebSocket-in-NET-Part (向下滚动到“网页中的 JavaScript”部分)

我能够很容易地使用控制台应用程序客户端使其工作,但它给我带来的只是尝试直接从浏览器连接时遇到的麻烦。即使在使用这个例子作为参考之后,让我绊倒的事情是:

1.监听器和回调都需要将Message对象作为参数。您不能使用原始类型或自定义对象。我能够使用控制台应用程序使用字符串参数。

2.方法(监听器和回调)都需要这个属性

 [OperationContract(IsOneWay = true, Action = "*")]

我玩了一会儿,除了 * 动作外,无法让它与任何东西一起使用。我假设您可以通过某种方式将其包含在 url 中来指定一个操作,但我无法弄清楚。

3. 虽然可以使用 NetHttpBinding 让它工作,但我只能使用他们在示例中使用的自定义绑定让它工作。

4.我在 javacript 代码中的 url 的末尾有 .svc,如下所示:

 new WebSocket("ws://localhost:1234/Service.svc");

如果没有看到更多代码,很难为您提供问题的准确解决方案,但我能够按照这个示例让它工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-26
    • 2016-09-23
    • 1970-01-01
    • 2019-03-26
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多