【发布时间】:2018-12-15 03:17:44
【问题描述】:
我正在使用此代码向 azurewebsites 发布 HTTPS 帖子。 http://MYAPP.azurewebsites.net/api/MYFUNC
我目前正在使用此代码:
procedure TForm1.OriginalTest();
var
lHTTP: TIdHTTP;
HTTPResult: string;
RequestBody: TStream;
URL: String;
Body: string;
IOHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
lHTTP := TIdHTTP.Create;
try
Body := '{}';
RequestBody := TStringStream.Create(Body, TEncoding.UTF8);
lHTTP.Request.Accept := '';
lHTTP.Request.UserAgent := '';
lHTTP.Request.CustomHeaders.Add('x-functions-key:<your api key>');
lHTTP.ConnectTimeout := 24000;
lHTTP.ReadTimeout := 24000;
IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
IOHandler.SSLOptions.Method := sslvTLSv1_2;
lHTTP.IOHandler := IOHandler;
try
URL := 'https://<yourapp>.azurewebsites.net/api/<funcname>';
HTTPResult := lHTTP.Post(url, RequestBody);
Memo1.Lines.Add(HTTPResult);
except
on E:Exception do
begin
Memo1.Lines.Add(Format('Error sending data. Error: %s', [E.Message] ));
end;
end;
finally
lHTTP.Free;
RequestBody.Free;
end;
end;
无论出于何种原因,这段代码给了我以下错误:
发送数据时出错。错误:Socket Error #10054 Connection reset by peer。
我尝试使用 .NET 和 HttpWebRequest 制作一个简单的 HTTPS Post,它工作正常。我在这里做错了什么?
【问题讨论】:
-
您是否尝试过其他 HTTP 客户端,例如 curl?
-
该错误意味着服务器正在终止连接。它可能不喜欢您的 SSL/TLS 握手或 HTTP 请求中的某些内容。您是否严格要求仅使用 TLS 1.2?您是否尝试过启用 TLS 1.0 和 TLS 1.1?你为什么要清除
UserAgent?为什么不指定ContentType?此外,您正在泄漏IOHandler对象,因为您没有在其上调用Free(),或为其分配Owner。 -
@mjn 是的,就像我写的那样,我尝试用 .NET 和 C# 编写一个简单的应用程序,它在那里运行良好。我还下载了另一个 HTTP 客户端 - 也可以在那里工作。这个问题只发生在我的 Delphi 代码中。我尝试了所有不同的 TLS 版本,但似乎都没有。我试过设置内容类型和用户代理。我将它们留空的原因是因为当我在 C# 代码中将它们留空时它可以工作。我也确实更改了代码,因此我为 IOHandler 分配了一个所有者并释放了该对象,没有任何区别。那只是一些测试代码,我正在尝试各种不同的代码。
-
-
@Yako "Connection Refused" 发生在 TCP 层,而不是 HTTP 层。这意味着 1) 客户端尝试连接到未侦听连接的 IP:Port,2) IP:Port 正在侦听但有太多未决连接,或 3) IP:Port 被防火墙阻止/路由器、防病毒软件等。很可能,您的应用程序未连接到其他应用程序连接到的同一 IP:端口。使用 Wireshark 进行验证。
标签: delphi ssl post https indy