HttpWebRequest Post 到 Oracle 服务的连接被强行关闭
HttpWebRequest Post to Oracle Service Connection was forcibly closed
尝试通过 ASP.net C# 使用 Oracle Warehouse Cloud REST API。 API Documentation
当我调用 Rest 服务进行对象查询 API 时,出现 2 个错误:
- IOException:无法从传输连接读取数据:现有连接被远程主机强行关闭。
- SocketException: 现有连接被远程主机强行关闭
Oracle 支持将我引导至他们的支持库中的 Doc ID 967964.1,其中指出 SendChunked = true;之前已经解决了这个错误,但是我没有运气添加它,我也觉得它不适合 GET REST 调用。
这是我开始时使用的代码:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(HTTPsURL);
request.Method = "GET";
request.PreAuthenticate = true;
request.Credentials = cred;
request.ContentType = "application/xml";
using (var response = (HttpWebResponse)request.GetResponse())
using (Stream stream = response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
var content = reader.ReadToEnd();
return content;
}
我已经能够从 SOAP UI 和 Postman 得到回复。在这两种情况下,我都需要将 Header Content-Type 设置为 "application/xml",并预先提供授权。
在 SOAP UI 中,我的请求如下所示:
GET {My URL is HERE} HTTP/1.1
Accept-Encoding: gzip,deflate
Authorization: Basic { BASIC KEY }
Content-Type: application/xml
Host: ta3.wms.ocs.oraclecloud.com
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
当我尝试通过 Fiddler 查看我的 .Net 代码时,我没有看到从 .Net 应用程序传递的内容类型。有什么我想念的吗?还是我确实需要分块传递呼叫?
当 SendChunked = true 时,我得到错误:无法为不写入数据的操作设置 Content-Length 或 Chunked Encoding
当我尝试传递数据时,出现错误:无法发送具有此动词类型的内容正文
我尝试过的一些事情:
- 修改自动解压
- 修改安全协议
- 传输编码 gzip,deflate
- Enable/Disable 自动重定向
- 还有以下几种变体:Accept、KeepAlive、UserAgent、CachePolicy、ProtocolVersion
也许使用 HttpWebRequest 是不可能的。我应该尝试采用更好的方法吗?
我的最终要求是从此调用中取回数据,然后启动其他 .Net 进程。
这听起来像是 TLS 1.2 问题,尤其是因为它在 Postman 中有效,但在 .Net 中无效。 .Net 的旧版本不会自动使用 TLS 1.2 并尝试使用旧协议进行身份验证并立即被拒绝。
有很多针对此问题的修复程序,可以是服务器上的注册表,也可以是特定于应用程序的修复程序,但您应该首先了解自己在做什么,以免搬起石头砸自己的脚。我建议阅读这篇文章并尝试一些修复。
尝试通过 ASP.net C# 使用 Oracle Warehouse Cloud REST API。 API Documentation
当我调用 Rest 服务进行对象查询 API 时,出现 2 个错误:
- IOException:无法从传输连接读取数据:现有连接被远程主机强行关闭。
- SocketException: 现有连接被远程主机强行关闭
Oracle 支持将我引导至他们的支持库中的 Doc ID 967964.1,其中指出 SendChunked = true;之前已经解决了这个错误,但是我没有运气添加它,我也觉得它不适合 GET REST 调用。
这是我开始时使用的代码:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(HTTPsURL);
request.Method = "GET";
request.PreAuthenticate = true;
request.Credentials = cred;
request.ContentType = "application/xml";
using (var response = (HttpWebResponse)request.GetResponse())
using (Stream stream = response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
var content = reader.ReadToEnd();
return content;
}
我已经能够从 SOAP UI 和 Postman 得到回复。在这两种情况下,我都需要将 Header Content-Type 设置为 "application/xml",并预先提供授权。
在 SOAP UI 中,我的请求如下所示:
GET {My URL is HERE} HTTP/1.1
Accept-Encoding: gzip,deflate
Authorization: Basic { BASIC KEY }
Content-Type: application/xml
Host: ta3.wms.ocs.oraclecloud.com
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
当我尝试通过 Fiddler 查看我的 .Net 代码时,我没有看到从 .Net 应用程序传递的内容类型。有什么我想念的吗?还是我确实需要分块传递呼叫?
当 SendChunked = true 时,我得到错误:无法为不写入数据的操作设置 Content-Length 或 Chunked Encoding
当我尝试传递数据时,出现错误:无法发送具有此动词类型的内容正文
我尝试过的一些事情:
- 修改自动解压
- 修改安全协议
- 传输编码 gzip,deflate
- Enable/Disable 自动重定向
- 还有以下几种变体:Accept、KeepAlive、UserAgent、CachePolicy、ProtocolVersion
也许使用 HttpWebRequest 是不可能的。我应该尝试采用更好的方法吗?
我的最终要求是从此调用中取回数据,然后启动其他 .Net 进程。
这听起来像是 TLS 1.2 问题,尤其是因为它在 Postman 中有效,但在 .Net 中无效。 .Net 的旧版本不会自动使用 TLS 1.2 并尝试使用旧协议进行身份验证并立即被拒绝。
有很多针对此问题的修复程序,可以是服务器上的注册表,也可以是特定于应用程序的修复程序,但您应该首先了解自己在做什么,以免搬起石头砸自己的脚。我建议阅读这篇文章并尝试一些修复。