HttpWebRequest发布到Oracle Service Connection被强制关闭

时间:2018-10-19 14:11:25

标签: c# asp.net rest httpwebrequest

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

当我调用对象查询API的Rest Service时,出现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应用程序传递的Content-Type。我在那里想念什么吗?还是我确实需要分批传递呼叫?

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

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

我尝试过的一些事情:

  • 修改自动解压缩
  • 修改安全协议
  • 传输编码gzip,deflate
  • 启用/禁用自动重定向
  • 以及以下几种变体:Accept,KeepAlive,UserAgent,CachePolicy,ProtocolVersion

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

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

1 个答案:

答案 0 :(得分:2)

这听起来像是TLS 1.2问题,尤其是因为它可以在Postman中工作,但不能在.Net中工作。较早版本的.Net不会自动使用TLS 1.2,而是尝试使用较旧的协议进行身份验证并立即被拒绝。

对此有很多修复程序,无论是服务器上的注册表还是特定于应用程序的程序,但您都应该先了解自己在做什么,这样才不会使自己陷入困境。我建议阅读本文并尝试一些修复程序。

Stack Overflow discussion