2017-07-27 16 views
0

以前にwsDualHttpBindingを使用していた既存のデュプレックスWCF Webサービスがあります。これをWeb Sockets(netHttpBinding)に切り替えて、Webブラウザクライアントから使用できるようにしようとしています。JavaScriptクライアントとWCFサービスの間でWebSocketハンドシェイクが失敗しました

の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トレースを有効にしています - ログには受信中のバイトが表示されますが、エラーはありません。 devsツールのwebsocketアップグレード要求は、失敗したアップグレードを表すBad Request応答を表示します。これはIIS 8搭載のWindows 10マシン上にあり、Webソケットプロトコルが有効であることを確認しました。

Webサービスは、.NETコンソールクライアント(DuplexChannelFactory<>を使用)で動作します。私はブラウザでJS WebSocketを使用してこのエラーを取得します。開発ツールから

要求/応答トレース:

enter image description here

どのように解決するか、このエラーの詳細情報を得ることができますか?

+0

ポート8888に接続しようとしましたが、原点は1646ですか? – Luke

+0

localhost:8888はWebサービスが実行されている場所、localhost:1646はクライアントページを提供したWebサーバーです。これはクロスオリジンの問題ですか? –

+0

localhostの代わりにipを使用して接続できるかどうかを確認します。例えばws://192.168.0.1:8888/CallbackService – Luke

答えて

0

これは私にはかなりの時間がかかりました。私はこの例に従うことによって、ついにそれを働かせることができました。 https://www.codeproject.com/Articles/619343/Using-WebSocket-in-NET-Part (「JavaScriptのWebページの」セクションまでスクロール)

私はそれがコンソールアプリケーションのクライアントで非常に簡単に仕事を得ることができたが、それは、ブラウザから直接接続しようとしている私に迷惑しか与えませんでした。この例を参照として使用した後でも、私を引きつけたものは次のとおりです。

1.リスナーとコールバックの両方で、Messageオブジェクトをパラメータとして取得する必要があります。プリミティブ型またはカスタムオブジェクトは使用できません。私は、コンソールアプリケーションを使用して文字列パラメータを使用することができました。

2.Both方法(リスナーおよびコールバック)私は少し周りを演奏し、これは、アクションのための*以外のもので動作するように取得することができませんでした

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

この属性を必要としています。私はおそらく何らかの形でURLにURLを含めることでアクションを指定できると仮定していますが、それを把握することはできませんでした。

3. NetHttpBindingを使用して動作させることは可能かもしれませんが、この例で使用するカスタムバインディングを使用して動作させることしかできませんでした。

4.My javacriptコード内のURLはそうのような終わり.SVC持っていた:あなたのコードの多くを見ることなく

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

、あなたの問題の厳密解を提供することは困難であるが、私はこの例の後に動作させることができました。

関連する問題