.Net Core ClientWebSocket:无法连接到服务器

Posted

技术标签:

【中文标题】.Net Core ClientWebSocket:无法连接到服务器【英文标题】:.Net Core ClientWebSocket: Unable to connect to server 【发布时间】:2017-04-18 22:31:44 【问题描述】:

我正在构建一个 Web 应用程序,它连接到 Predix Timeseries 实例以通过 websocket 获取数据。当我尝试创建套接字时,我得到了这个异常:

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 检索我的身份验证令牌,但没有来自此服务。

我是否在某处遗漏了一些配置步骤?任何帮助或指导将不胜感激。

【问题讨论】:

【参考方案1】:

我发现了这个问题。 Predix 时间序列的三个必需标头是:

Predix-Zone-Id:zone_id_here 授权:承载auth_token_here 来源:“https:// hostname_here

我的问题是我尝试了 Origin 标头,但 application_uris 的 Predix VCAP_APPLCIATION 环境变量不包含“https://”。一旦我手动添加它(“https://”+ uri),它就可以正常工作了。

【讨论】:

【参考方案2】:

我没有在 C# 中完成此操作,但“无法连接”听起来可能是网络问题。你可以打开另一个服务器的 websocket 吗?也许是这个?

https://www.websocket.org/echo.html

可能是代理服务器问题?您可以从其他网络尝试吗?

【讨论】:

我尝试了您的建议,但没有成功 - 不同的网络和 websocket 测试产生了相同的结果。还有其他 Predix 可能需要连接的东西吗?我也联系了他们的支持团队并等待回复。

以上是关于.Net Core ClientWebSocket:无法连接到服务器的主要内容,如果未能解决你的问题,请参考以下文章

使用 ClientWebSocket .net 核心测试 TestHost.WebSocketClient

System.Net.WebSockets.ClientWebSocket 不能可靠地工作?

使用 .Net ClientWebSocket 从 WebSocket 获取数据

ClientWebSocket wss - 无法连接到远程服务器

如何使用 C# 和 ASP.Net Core 2.2 连接和收听外部 websocket url

System.Net.WebSockets 乒乓球