2017-07-27 11 views
0

Ich habe einen vorhandenen Duplex-WCF-Webdienst, der zuvor wsDualHttpBinding verwendet hat. Ich versuche, dies auf Web-Sockets (netHttpBinding) umzustellen, so dass es über einen Web-Browser-Client verwendet werden kann.WebSocket-Handshake zwischen JavaScript-Client und WCF-Dienst fehlgeschlagen

bekomme ich folgende Fehlermeldung beim Versuch das WebSocket-Objekt zu instanziiert:

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

WCF Config:

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

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

Ich habe aktiviert WCF Tracing - Die Logs zeigen Bytes empfangen, aber keine Fehler. Die Websocket-Aktualisierungsanforderung in Entwicklungstools zeigt eine ungültige Anforderung an, die eine fehlgeschlagene Aktualisierung darstellt. Dies ist auf einem Windows 10-Computer mit IIS 8 und ich habe überprüft, dass das WebSocket-Protokoll aktiviert ist.

Der Webdienst funktioniert mit einem .NET-Konsolenclient (mit DuplexChannelFactory<>). Ich bekomme diesen Fehler nur mit JS WebSocket im Browser.

Request/Response-Spur von Entwickler-Tool:

enter image description here

Wie kann ich lösen oder weitere Informationen zu diesem Fehler erhalten?

+0

versuchen Sie Verbindung mit Port 8888, aber Ursprung ist 1646? – Luke

+0

localhost: 8888 ist der Ort, an dem der Webdienst ausgeführt wird. Localhost: 1646 ist der Webserver, der die Clientseite bedient hat. Ist das ein ursprungsübergreifendes Problem? –

+0

Überprüfen Sie, ob Sie eine Verbindung herstellen können, indem Sie ip anstelle von localhost verwenden. zum Beispiel ws: //192.168.0.1: 8888/CallbackService – Luke

Antwort

0

Das hat mich ziemlich viel Zeit gekostet, um herauszufinden. Ich konnte es endlich funktionieren, indem ich diesem Beispiel folgte. https://www.codeproject.com/Articles/619343/Using-WebSocket-in-NET-Part (scrollen Abschnitt zum „in Web-Seite JavaScript“ down)

ich es bekommen konnte ganz leicht mit einer Konsole-Anwendung Client arbeiten, aber es gab mir nichts als Ärger direkt von einem Browser zu verbinden versuchen, . Auch nach der Verwendung dieses Beispiels als Referenz waren die Dinge, die mich stolperten:

1. Der Listener und Callback müssen beide das Message-Objekt als Parameter nehmen. Sie können keinen primitiven Typ oder ein benutzerdefiniertes Objekt verwenden. Ich konnte einen String-Parameter mit der Konsolenanwendung verwenden.

2.Both Methoden (Hörer und Rückruf) müssen dieses Attribut

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

ich um ein wenig gespielt und konnte dies mit etwas für die Aktion, sondern ein * zur Arbeit kommen. Ich gehe davon aus, dass Sie wahrscheinlich eine Aktion angeben können, indem Sie sie irgendwie in die URL aufnehmen, aber ich konnte es nicht herausfinden.

3.Während es möglich sein könnte, es mit dem NetHttpBinding zu arbeiten, konnte ich es nur mit der benutzerdefinierten Bindung arbeiten, die sie in dem Beispiel verwenden.

4.My url im Javacript Code hatte wie so am Ende .svc:

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

Ohne mehr den Codes zu sehen, ist es schwierig, sie mit einer genauen Lösung für Ihr Problem zu schaffen, aber Ich konnte es nach diesem Beispiel zur Arbeit bringen.

Verwandte Themen