Ruby 1.9.3用TCPSocket调用Azure ML Endpoint遇连接重置错误
问题分析与解决方案
核心问题原因
你的代码存在两个关键错误,导致服务器强制关闭连接:
- 未使用SSL加密:目标端口是443(HTTPS专属端口),直接用
TCPSocket发送明文HTTP请求,服务器会拒绝并强制断开连接。 - 请求行格式错误:POST请求的语法不符合HTTP规范,包含多余单引号,且未指定Azure ML推理端点的正确路径(默认路径为
/score)。
修正后的代码
require 'socket' require 'openssl' data = '{ "Inputs": { "data": [ { "Column1": "example_value", "Column2": 0 } ] }, "GlobalParameters": { "method": "predict" } }' # 建立TCP连接并包装为SSL加密连接 tcp_socket = TCPSocket.open('xxxxx-ml-yyyyy.northeurope.inference.ml.azure.com', 443) socket = OpenSSL::SSL::SSLSocket.new(tcp_socket) socket.connect # 修正请求行:指定正确端点路径,移除多余单引号 request = "POST /score HTTP/1.1\r\n" request += "Host: xxxxx-ml-yyyyy.northeurope.inference.ml.azure.com\r\n" request += "Content-Type: application/json\r\n" request += "Authorization: Bearer 1234567890abcdefghjklmnopqrstuvwx\r\n" request += "Content-Length: #{data.bytesize}\r\n" request += "\r\n" request += data socket.print(request) # 读取响应内容 response = "" while line = socket.gets response += line end # 依次关闭SSL套接字与底层TCP套接字 socket.close tcp_socket.close puts response
关键修改说明
- 添加SSL加密支持:引入Ruby 1.9.3自带的
openssl库,用SSLSocket包装TCPSocket,建立符合HTTPS要求的加密连接。 - 修正请求行格式:将错误的请求行改为
POST /score HTTP/1.1,其中/score是Azure ML推理端点的默认路径(若你的端点有自定义路径,请替换为实际路径)。 - 规范连接关闭流程:先关闭SSL套接字,再关闭底层TCP套接字,确保资源正常释放。
内容的提问来源于stack exchange,提问作者Ambro
相关产品推荐
相关产品推荐

