我有一个以前使用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来获取此错误。
来自开发工具的请求/响应跟踪:
如何解决或获取有关此错误的更多信息?
答案 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");
如果没有看到更多代码,很难为您提供问题的精确解决方案,但我可以按照此示例使其工作。