JavaScript客户端和WCF服务之间的WebSocket握手失败

时间:2017-07-27 13:44:44

标签: javascript wcf websocket

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

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

val ds = spark.read.json("some/path/to/lots/of/json/*.json")

ds.foreach(record => {
  val moniker : String = record.select("moniker")
  val specialDate : Date = deriveSpecialDate(moniker)
  val specialUuid : UUID = deriveSpecialUuid(moniker)
  val specialPhrase : String = deriveSpecialPhrase(moniker)

  // This doesn't work because special_* fields don't exist in the original
  // schema dervied from the JSON files. We're ADDING these columns after the
  // JSON read and then populating their values dynamically.
  record.special_date = specialDate
  record.special_uuid = specialUuid
  record.special_phrase = specialPhrase
})

WCF配置:

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

JS代码:

<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>

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

Web服务 与.NET控制台客户端一起使用(使用var url = 'ws://localhost:8888/CallbackService'; var socket = new WebSocket(url); // error )。我只在浏览器中使用JS WebSocket来获取此错误。

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

enter image description here

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

1 个答案:

答案 0 :(得分:0)

我花了很多时间才弄明白。通过这个例子,我终于可以使它工作了。 https://www.codeproject.com/Articles/619343/Using-WebSocket-in-NET-Part (向下滚动到&#34;网页中的JavaScript&#34;部分)

我能够通过控制台应用程序客户端很容易地让它工作,但它给了我一点但没有尝试直接从浏览器连接的麻烦。即使在使用这个例子作为参考之后,引起我兴趣的是:

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

2.Both方法(监听器和回调)需要此属性

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

我玩了一会儿,除了行动之外的任何东西都无法使用它。我假设您可以通过某种方式将其包含在网址中来指定操作,但我无法弄明白。

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

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

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

如果没有看到更多代码,很难为您提供问题的精确解决方案,但我可以按照此示例使其工作。