.NET Avalonia调用XTB API遇响应提前终止错误,如何配置SSL?
解决XTB模拟账户登录的SSL连接问题
你遇到的IOException: The response ended prematurely错误,核心原因是端口与协议不匹配:XTB的5124端口是无加密的WebSocket服务端口,并非HTTPS/HTTP服务端口,用HttpClient发送POST请求自然会出现协议错误。
下面提供两种在Avalonia .NET项目中实现正确SSL连接的方案:
方案一:使用XTB REST API(HTTPS)
XTB的REST API通过标准HTTPS端口443提供服务,修改请求端点即可正常发起SSL请求:
public static async Task Login() { var httpClient = new HttpClient(); // 替换为XTB REST API的正确HTTPS端点 var uri = new Uri("https://xapi.xtb.com/api.trading"); using StringContent jsonContent = new( JsonSerializer.Serialize(new { command = "login", arguments = new { userId = "XXXX", password = "XXXX", // 模拟账户必须添加此参数,值为true demo = true } }), Encoding.UTF8, "application/json"); using HttpResponseMessage response = await httpClient.PostAsync(uri, jsonContent); response.EnsureSuccessStatusCode(); // 主动校验请求状态,异常时直接抛出 var jsonResponse = await response.Content.ReadAsStringAsync(); Console.WriteLine($"{jsonResponse}\n"); }
方案二:使用WebSocket SSL连接(官方优先推荐)
XTB核心API基于WebSocket实现,SSL加密的WebSocket端口为5123,使用ClientWebSocket完成连接:
public static async Task LoginViaWebSocket() { using var webSocket = new ClientWebSocket(); // SSL加密的WebSocket端点 var uri = new Uri("wss://xapi.xtb.com:5123"); await webSocket.ConnectAsync(uri, CancellationToken.None); // 构造登录消息 var loginMsg = JsonSerializer.Serialize(new { command = "login", arguments = new { userId = "XXXX", password = "XXXX", demo = true } }); var buffer = Encoding.UTF8.GetBytes(loginMsg); var segment = new ArraySegment<byte>(buffer); // 发送登录请求 await webSocket.SendAsync(segment, WebSocketMessageType.Text, true, CancellationToken.None); // 接收响应 var receiveBuffer = new byte[1024 * 4]; var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), CancellationToken.None); var responseMsg = Encoding.UTF8.GetString(receiveBuffer, 0, result.Count); Console.WriteLine($"{responseMsg}\n"); // 后续业务操作... // 关闭连接 await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "操作完成", CancellationToken.None); }
额外注意事项
- 模拟账户必须在登录参数中添加
demo = true,否则会默认连接真实账户环境 - Avalonia .NET对
HttpClient和ClientWebSocket的支持与标准.NET一致,无需额外配置SSL证书(XTB官方证书已被主流信任链收录)
内容的提问来源于stack exchange,提问作者JGeorgeJ
相关产品推荐
相关产品推荐

