【发布时间】:2020-04-25 06:25:45
【问题描述】:
有没有人让 TD Ameritrade 流媒体 API 与 C# 一起使用?他们在https://developer.tdameritrade.com/content/streaming-data 有一些文档和 JavaScript 示例。我已经让 JavaScript 示例在 https://js.do/ 上工作,但无法获得与在 .NET 中工作类似的东西。这是我正在尝试做的缩短版本。我无法准确包含我发送的内容,因为我正在尝试发送包含帐户信息的登录消息,但我可以说我将在我的 JavaScript 测试中工作的确切 JSON 消息复制并粘贴到文件 LoginJSON .txt 在此示例中。在此示例中,套接字将在我发送消息后立即关闭,根本没有文本响应。但是,如果我发送故意格式错误的消息,我实际上会收到文本响应,说明该消息格式错误,然后断开套接字连接。他们的支持没有回应,我理解这是常态。 https://www.youtube.com/channel/UCBsTB02yO0QGwtlfiv5m25Q 这里有一些 python 示例,但我都看过了,还没有学到任何东西来帮助我让我的代码正常工作。
ClientWebSocket socket = new ClientWebSocket();
var connectAsync = socket.ConnectAsync(new Uri("wss://streamer-ws.tdameritrade.com/ws"), CancellationToken.None);
string loginRequest;
using (StreamReader re = new StreamReader("LoginJSON.txt")) {
loginRequest = re.ReadToEnd();
}
connectAsync.Wait();
Thread readThread = new Thread(
delegate(object obj)
{
while (true) {
if (socket.State == WebSocketState.Open) {
Console.Out.WriteLine("Waiting");
byte[] recBytes = new byte[1024];
var clientBuffer = new ArraySegment<byte>(recBytes);
var receiveAsync = socket.ReceiveAsync(clientBuffer, CancellationToken.None);
receiveAsync.Wait();
switch (receiveAsync.Result.MessageType) {
case WebSocketMessageType.Text:
var s = Encoding.UTF8.GetString(recBytes);
Console.Out.WriteLine(s.Trim());
break;
case WebSocketMessageType.Close:
Console.Out.WriteLine("Close message received");
break;
default:
throw new ArgumentOutOfRangeException();
}
}
}
});
readThread.Start();
socket.SendAsync(Encoding.UTF8.GetBytes(loginRequest), WebSocketMessageType.Text, true, CancellationToken.None);
Console.ReadLine();
【问题讨论】:
-
使用像wireshark或fiddler这样的嗅探器。检查响应状态,如 200 OK 以确定错误。最好的调试方法是比较工作和非工作应用程序中第一个请求的标头。 c# 中的默认标头与其他方法不同。要解决问题,使 c# 中的标头看起来像工作应用程序中的标头。
-
@jdweng 我试过这个,但遗憾的是我不熟悉 Wire Shark 和网络捕获。我有两个应用程序的两个捕获。每个只有 20 个左右的相关条目。失败的应用程序中的最后一个条目以红色突出显示,所以我认为这是断开连接。我没有看到任何看起来像 200 OK 的东西。还有什么我可以寻找的吗?
-
您只得到响应的正文,而不是完整的消息。您可以免费下载 wireshark 或 fiddler,它们在调试网络问题时提供了很多有用的信息。
-
@jdweng 抱歉,不熟悉我的意思是我没有太多使用它,但 Wire Shark 是我用来捕获上述网络流量的工具。我看到了诸如“Client Hello”、“Server Hello,Change Cipher Spec”、“Encrypted Handshake Message”之类的消息,以及一些“Application Data”消息。它们从一个应用程序到另一个应用程序看起来略有不同,但我不确定什么是有意义的。它们看起来从同一应用程序的一个捕获到另一个略有不同。感谢您的建议,但这可能有点超出我的想象。
-
HTTP 消息使用 TCP 作为传输层。 TCP 的最大长度约为 1500 字节。因此,每条 HTTP 消息都由一条或多条 TCP 消息组成。此外,对于安全 https,还有一个在 TCP 中完成的 TLS/SSL 安全协议。您应该首先查看第一个 http 请求标头。客户端和服务器之间存在协商,其中来自客户端的标头和网页上的标头确定操作模式。由于您的第一个请求中的标头错误,您将进入错误的模式。您需要将 c# 中的标头修改为与工作应用程序相同。
标签: c# websocket streaming stock ameritrade