3

Predix Timeseries インスタンスに接続して Websocket を介してデータを取り込む Web アプリケーションを構築しています。ソケットを作成しようとすると、次の例外が発生します。

System.Net.WebSockets.WebSocketException: 'リモート サーバーに接続できません'

このコードを使用して websocket を作成していますが、ConnectAsync 呼び出しでエラーがスローされます。

public async Task openWebSocket()
    {
        _socket = new ClientWebSocket();

        _socket.Options.SetRequestHeader(headerName: "predix-zone-id", headerValue: PREDIX_ZONE_ID_HERE);
        _socket.Options.SetRequestHeader(headerName: "authorization", headerValue: "Bearer " + AUTH_TOKEN_HERE);
        _socket.Options.SetRequestHeader(headerName: "content-type", headerValue: "application/json");
        CancellationToken token = new CancellationToken();

        var uri = new Uri(uriString: "wss://gateway-predix-data-services.run.aws-usw02-pr.ice.predix.io/v1/stream/messages");
        await _socket.ConnectAsync(uri: uri, cancellationToken: token);

    }

ここに私の例外のスタックトレースがあります:

System.Net.WebSockets.WebSocketException occurred
  HResult=0x80004005
  Message=Unable to connect to the remote server
  Source=<Cannot evaluate the exception source>
  StackTrace:
   at System.Net.WebSockets.WebSocketHandle.<ConnectAsyncCore>d__20.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Net.WebSockets.ClientWebSocket.<ConnectAsyncCore>d__16.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at PROJECTNAME.Services.TimeseriesService.<openWebSocket>d__6.MoveNext() in %PROJECTLOCATION%\Services\%SERVICENAME%.cs:line 34
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at PROJECTNAME.Services.TimeseriesService.<Initialize>d__5.MoveNext() in %PROJECTLOCATION%\Services\%SERVICENAME%.cs:line 21
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at PROJECTNAME.Program.<Initialize>d__1.MoveNext() in %PROJECTLOCATION%\Program.cs:line 52

Inner Exception 1:
WebSocketException: Unable to connect to the remote server

内部の例外スタック トラックには、これ以上の情報はほとんどありませんが、役立つ可能性がある ThrowOnInvalidConnectState() に注目してください。

    at System.Net.WebSockets.WinHttpWebSocket.ThrowOnInvalidConnectState()
   at System.Net.WebSockets.WinHttpWebSocket.<ConnectAsync>d__18.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Net.WebSockets.WebSocketHandle.<ConnectAsyncCore>d__20.MoveNext()

他に何を試すべきかわかりません-SOに関する他の多くの投稿には、少なくとも内部例外にいくつかの有用な情報があります。

また、Fiddler を使用しようとしました。UAA からの認証トークンの取得など、他のサービスのメッセージは表示されますが、このサービスからは何も表示されません。

どこかで構成手順が抜けていませんか? ヘルプやガイダンスをいただければ幸いです。

4

2 に答える 2

2

私は問題を理解しました。Predix Timeseries に必要な 3 つのヘッダーは次のとおりです。

  • Predix-Zone-Id: zone_id_here
  • 承認: Bearer auth_token_here
  • オリジン: " https:// hostname_here

私の問題は、Origin ヘッダーを試したことですが、application_uris の Predix VCAP_APPLCIATION 環境変数に「https://」が含まれていないことです。手動で追加すると(「https://」+ uri)、正常に機能しました。

于 2017-04-24T05:45:02.430 に答える