问题标签 [system.net.websockets]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
7542 浏览

.net - 在 ClientWebSocket 中设置“User-Agent”HTTP 标头

我需要在ClientWebSocket对象中设置“User-Agent”HTTP 标头,但这是不可能的。尽管有一个ClientWebSocket.SetRequestHeader(header,value),但如果我尝试设置该标头,该方法将失败:System.ArgumentException: This header must be modified using the appropriate property or method.

ClientWebSocket源代码,似乎MS人完全忘记了这一点:

所以我看到的唯一方法是用反射替换这个方法并正确地重写代码(检查特殊的头文件并使用特殊的属性,比如httpWebRequest.UserAgent)。

还有其他更好的主意吗?

0 投票
1 回答
1756 浏览

c# - 设置 ServicePointManager.ServerCertificateValidationCallback 并关闭跟踪时出现 TypeInitializationException

TypeInitializationException我尝试设置时遇到未处理的异常

当我的app.config 中有以下内容(取自MSDN )时,就会发生异常。与下面的配置和MSDN 上的配置的唯一区别是我为System.NetSystem.Net.Cache和设置了日志记录。我只有在所有四个都关闭时才看到问题。System.Net.SocketsSystem.Net.WebSocketsOff

这个配置有问题还是我错过了其他东西?

这是异常的堆栈跟踪

有一个内部异常,也是 TypeInitializationException 类型,调用堆栈仅包含at System.Net.ServicePointManager..cctor()消息是“'System.Net.ComNetOS' 的类型初始化程序引发了异常。”。

这有一个 type 的最终内部异常ConfigurationErrorsException。消息是“在 sharedListeners 部分中不存在侦听器‘System.Net’。” 堆栈跟踪是

0 投票
0 回答
1169 浏览

asp.net - 如何使用 IIS 跟踪 Websocket 流量

我正在使用 IIS 10,需要跟踪当有人向服务器打开 websocket 时创建的 .NET 4.5.2 WebSocket 流入和流出的流量,这似乎是不可能的。

当前的跟踪配置正在记录 System.Net、System.Net.Http、System.Net.Sockets 和 System.Net.WebSockets。

这些被写入 NLog 目标。每当服务器从其他套接字(如 Redis 或 Azure 存储)发送或接收数据时,我都会在我的日志中获得跟踪。

但是,当客户端连接到服务器时,我在打开 WebSocket 时得到 http 跟踪,但客户端和服务器之间没有数据跟踪。

问题基本上是,IIS 是否真的写了任何关于 AspNetWebSocketContext.WebSocket 的跟踪?如果是这样,我如何记录这些数据?

为了澄清我的配置,Nlog 配置:

以及 web.config 的相关部分

0 投票
1 回答
484 浏览

asp.net-mvc - Websocket 服务器问题:onOpen 命中客户端,但服务器 websocket 处理程序 OnOpen 和其他事件从未命中

我对 websockets 和 WebAPI 很陌生(我们的系统都是 .NET MVC,只是不是 WebAPI),所以我很可能只是遗漏了一些明显的东西(我希望如此)。

我正在尝试实现一个简单的客户端来玩。我在(可悲的)VB中在.NET中工作,我试图让websocket正常工作,并点击OnOpen/Message/Close事件服务器和客户端。

我的代码在下面,但简而言之,websocket 握手似乎没有任何问题,因为我在javascript中的 onOpen() 事件被命中,当我输出 readyState 时,它​​的值为 1。但是 OnOpen 不会受到服务器端的影响

输出最终看起来像这样:

立即就绪状态:0

开启就绪状态:1

插座关闭

我的 WebSocketHandler 的构造函数被命中(例如,如果我在 MyBase.New() 行上抛出一个断点,它就会命中它)。但是 OnOpen 永远不会被命中,并且套接字会立即命中 js 中的 onclose 事件。我应该做些什么来保持套接字打开?为什么 OnOpen 不会被击中?

我的代码如下:

Javascript:

服务器:

0 投票
1 回答
1751 浏览

c# - ASP.NET MVC Websocket 服务器 (WebAPI) 握手完成,但 OnOpen 和其他事件函数没有受到服务器端的影响

注意: 我用 C# 标记它,因为我相信它会在 ASP.NET 社区中影响更广泛的受众。如果这是一个问题,请告诉我,我可以删除它(C# 是我的首选语言,但对于这个项目我'我被迫用VB编写)。websocket 服务器是用 VB.NET ASP.NET WebApi 编写的。任何帮助将不胜感激。

我只是想让连接打开,保持打开状态,然后从客户端向服务器发送一条快速字符串消息。我已将我的服务器代码简化为尽可能简单,并在下面完整发布。


以下是我的服务器代码: 注意:我将注释从 VB 的“'”更改为 C# 的“//”,因为它在堆栈溢出的代码块中显示为字符串。


握手成功:

运行时,握手似乎成功,因为该行(以及构造函数)被命中并且没有错误:

客户端onOpen()函数被击中,写出readystate为 1。但是,当第二行在 onOpen() 中被击中时,websocket 出于某种原因立即关闭(它跳转到onClose()处理程序)


问题:

ChatWebSocketHandler.OnOpen()(见底部的服务器代码)永远不会被命中。事实上,除了握手期间的构造函数之外,该类中的任何方法( OnClose() OnError()等)都不会被命中。为什么这些没有被击中?

请注意,如果我在websocket.send()行上设置断点,则在执行该行之前 readystate 仍然为 1,并且在该行不会出错,它只是跳转到websocket.onClose()事件。 .

预先感谢您的帮助!如果需要,我可以发布更多的客户端。

0 投票
1 回答
1144 浏览

c# - 如何基于 web 套接字将 http web 请求中继到本地 api

我必须实现一个架构来解决下图所代表的问题:

云到本地 API

基本上,我必须在云 (Azure) 中部署公共 API,但数据位于本地机器中。本地机器公开提供数据的 Swagger API。每台本地机器都有一个唯一标识符(安装标识符),允许我们路由请求。

我按照以下链接中建议的方法,基于 Azure Service Bus 的 Relay 模块开发了一个解决方案:

对本地 API 的安全 Internet 访问

基于 Azure Service Bus 的 Relay 模块的解决方案解决了我的问题,满足了我的大部分需求,但它有一个问题,延迟很糟糕。

我在同一个地理区域部署了公共 API 和服务总线端点,一个简单的请求 GET /companies 平均需要 1.5 秒,本地 API 的处理时间非常短,只有几毫秒..

为了保持低延迟,我一直在考虑使用网络套接字,但我不知道是否是考虑到这种情况的最佳方法,因为对于公共 API 的每个请求,我都必须打开一个网络套接字通道到 ApiController 内部的本地 API 并处理它的生命周期(在返回响应之前关闭它)。

显然,在这种场景下,on-premise API 中的每个 ApiController 都应该同时提供对 web sockets 和 http 的支持。

另一种解决方案是实现一个 http 代理,将原始请求从公共 API 中继到本地 API,但从我的角度来看,可能的最佳延迟是使用没有连接管理器的通信 P2P 实现的,因此我现在的重点是网络套接字。

我想尽可能地满足标准,因此我想使用“纯”网络套接字,这意味着不使用 Signalr。

有一次,我暴露了我的问题,解决方案和替代方案,我的问题如下:

  1. 如何在 ApiController 类的操作方法中打开 Web 套接字并将原始 http 请求从公共 API 中继到本地 API?

  2. 如何在本地 API 中为 HTTP 和 WebSockets 协议提供支持。本地 API 应该能够处理 HTTP 请求以及 WebSocket 请求。

  3. 我的第一个赌注是使用 System.Net.WebSockets,但我想知道是否存在与 ASP.NET Web API 集成时发光的任何 websockets 库。

0 投票
2 回答
8208 浏览

c# - c#检测ClientWebSocket何时断开(关闭)

经过长时间的搜索,我来找你帮助我。

我有一个 WPF 应用程序,使用 ClientWebSocket 类(使用 System.Net.WebSockets)连接到 WebSocket 服务器(NodeJS)。我的应用程序正在运行背景 Windows 应用程序,它第一次连接,然后在 1 分钟的计时器内尝试重新连接(如果尚未连接)。但是当我禁用连接(网络连接)时,我的应用程序没有检测到它,所以每 1 分钟告诉我它已连接。我知道我的代码有问题,并且我不知道如何实现事件处理程序以在连接丢失(websocket 关闭)时得到通知。

我注意到当我连接到服务器时,我必须创建一个会话,然后我收到一个 session_id,现在我连接到 websocket 服务器。

Class1 是我使用 WebSockets 类的库类

在我的 Class2 中,我使用 Class1

对于任何建议,我将不胜感激。我真的被困在这一点上

0 投票
0 回答
529 浏览

c# - Websocket 服务器发送自发消息(没有来自客户端的请求)

我必须承认我可能错过了一些基本的东西。如果有,请指出。以下是我对 websocket 服务器的理解。

我正在尝试编写一个 websocket 服务器,它应该让客户端更新他们请求执行的作业的状态。有一个初始交换,客户端在其中标识自己并发送作业 ID,但从那一刻起,客户端基本上不会向服务器发送任何其他消息。服务器一旦知道其后端状态的更新,就会向客户端发送一条消息,客户端做出相应的反应(通常没有消息返回)。

这是我的第一个 websocket 服务器,所以我按照微软的这个示例作为参考:https ://code.msdn.microsoft.com/The-simple-WebSocket-4524921c

该示例实现了一个回显服务器,用于回复客户端消息。由于我的不同需求,我重写了它,以便在循环ReceiveAsync之前调用一次。while在循环内部,我的服务器检查其状态,并在需要时发送更新消息。

但是,如果我要ReceiveAsyncwhile循环中调用(我的更新消息逻辑也是如此),那么循环将基本上被阻塞:如果我await要接收消息,但客户端通常不发送任何消息,我实际上是阻止我的服务器进入循环的下一次迭代。所以我删除了调用ReceiveAsync:我不期望消息,一切正常。

我的问题是我没有检查关闭消息,因为我ReceiveAsync只打电话一次。另外,我没有实际的全双工,现在还可以,但是将来可能会改变(或针对不同的项目)。

所以,关于实际问题:

1)专门等待Close消息重要吗?或者我可以假设当客户端的 websocket 对象被销毁时,websocket 会自动被杀死?

2)如何实现全双工通信?在传统的套接字中,我会有一个无限循环,我会检查是否有东西要读取(构造消息,使用它等),然后如果有东西要发送给客户端,然后迭代:如果没有阅读我会继续。但ReceiveAsync似乎是接收数据或检查是否有任何数据的唯一方法,如果没有数据它只是坐在那里并且永远不会完成。

我应该停止使用System.Net.Websockets并转向功能更强大的库吗?我发现的所有这些都是指“回复”客户消息,所以我不确定它们是否适合我的需求(也许这只是一个糟糕的示例和文档)。

0 投票
1 回答
167 浏览

c# - Watson Speech to Text:响应消息太长 - 被切断

我有一个功能齐全的 IBM Watson Speech To Text 客户端。我想开始记录更多元数据(单词置信度、开始/结束时间等),所以我在我的初始请求中添加了适当的字段。

一切都很顺利,直到我遇到将 Watson 文本消息响应反序列化为 JSON 对象的异常。当我打印字符串时,这就是结果。注意它被切断了,这解释了反序列化的错误:

看来我要求的信息太多了。从返回的System.Net.WebSockets.WebSocketReceiveResult对象ClientWebSocket.ReceiveAsync()具有result.Count描述发送的信息字节数的属性。在调试中我发现result.Count = 1024.

我的问题是:

1 - Watson 施加的 1kB 限制还是 .NET WebSocket 库的限制?

2 - 如何解除限制以接收完整消息?

编辑:最小的例子

有很多代码涉及到这个问题,但希望这能提供足够的上下文来帮助:

ResultsObject是要反序列化的本地类型。

0 投票
0 回答
1824 浏览

c# - 为什么不创建 ClientWebSocket 的新实例就不能重新打开关闭的 ClientWebSocket?

我目前正在研究一种System.Net.WebSockets实现,该实现将使用蜂窝网络以实时方式发送有关设备的数据包。使用蜂窝网络意味着我的解决方案应该能够在网络偶尔断开连接时重新连接套接字。我能够做到这一点的唯一方法是创建一个新的实例,ClientWebSocket然后异步发送连接消息。

这不是我的确切代码,但希望它能让我了解我正在尝试做的事情。

如果我在完全断开连接后尝试再次与同一对象连接,则会引发错误消息“Websocket 已启动”。我不明白的 WebSocket 是什么?

编辑 - 我正在将它构建到一个 NuGet 包中,以用作其他应用程序的库,因此由于程序将如何使用此功能,我需要留在 .NET 4.6 附近。