2017-07-27 229 views
0

我有一个以前使用wsDualHttpBinding的双工WCF Web服务。我试图将其切换到Web套接字(netHttpBinding),以便它可以通过Web浏览器客户端使用。JavaScript客户端和WCF服务之间的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对象时出现以下错误 - 日志显示正在接收的字节,但没有错误。开发工具中的websocket升级请求会显示错误的请求响应,表示升级失败。这是在带有IIS 8的Windows 10机器上,并且我已检查启用了WebSocket协议

Web服务确实使用.NET控制台客户端(使用DuplexChannelFactory<>)。我只在浏览器中使用JS WebSocket得到这个错误。从开发工具

请求/响应跟踪:

enter image description here

我该如何解决或获取关于此错误的详细信息?

+0

您尝试连接到端口8888,但来源是1646? – Luke

+0

localhost:8888是Web服务运行的地方,localhost:1646是服务于客户端页面的Web服务器。这是一个交叉来源问题吗? –

+0

检查您是否可以使用ip而不是localhost进行连接。例如ws://192.168.0.1:8888/CallbackService – Luke

回答

0

这花了我相当多的时间来弄清楚。通过以下示例,我终于可以正常工作。 https://www.codeproject.com/Articles/619343/Using-WebSocket-in-NET-Part (向下滚动到节中的“在网页的JavaScript”)

我能得到它与一个控制台应用程序客户端很容易的工作,但它给了我什么,但麻烦试图直接从浏览器连接。即使使用此示例作为参考,绊倒我的东西是:

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

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

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

我打得周围一点点,是无法得到这与什么,但对动作的*工作。我假设你可以通过以某种方式将它包含在URL中来指定一个动作,但我无法弄清楚。

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

4.My网址在javacript代码有.SVC在最后像这样:

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

没有看到更多的代码,它是很难为你提供一个确切的解决您的问题,但遵循这个例子,我能够得到它的工作。

相关问题