首页 > 解决方案 > HttpWebRequest Post to Oracle Service Connection 被强行关闭

问题描述

尝试通过 ASP.net C# 使用 Oracle Warehouse Cloud REST API。API 文档

当我调用对象查询 API 的 Rest 服务时,我收到 2 个错误:

Oracle Support 将我引导至其支持库中的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 应用程序传递的 Content-Type。那里有我想念的东西吗?或者我是否可能需要分块传递调用?

当 SendChunked = true 时,我收到错误:无法为不写入数据的操作设置 Content-Length 或 Chunked Encoding

当我尝试传递数据时,我收到错误:无法发送具有此动词类型的内容主体

我尝试过的几件事:

也许 HttpWebRequest 不可能。我应该尝试采用更好的方法吗?

我的最终要求是从此调用中取回数据,然后启动其他 .Net 进程。

标签: c#asp.netresthttpwebrequest

解决方案


这听起来像是 TLS 1.2 的问题,特别是因为它在 Postman 中有效,但在 .Net 中无效。旧版本的 .Net 不会自动使用 TLS 1.2 并尝试使用旧协议进行身份验证并立即被拒绝。

这个有很多修复,无论是服务器上的注册表,还是特定于应用程序的,但你应该先了解你在做什么,这样你就不会误伤自己。我建议阅读这篇文章并尝试一些修复。

堆栈溢出讨论


推荐阅读