Search code examples
c#asp.netresthttpwebrequest

HttpWebRequest Post to Oracle Service Connection was forcibly closed


Trying to use Oracle Warehouse Cloud REST API through ASP.net C#. API Documentation

When I make a call to the Rest Service to the Object Inquiry API, I'm getting 2 errors:

  • IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.
  • SocketException: An existing connection was forcibly closed by the remote host

Oracle Support directed me to Doc ID 967964.1 in their Support Library, which states SendChunked = true; has resolved the error before, but I haven't had luck adding it, nor do I feel it's appropriate for GET REST calls.

Here was the code I started with:

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;
}

I have been able to get a response back from SOAP UI and Postman. In Both cases I needed to set the Header Content-Type to "application/xml", and supply the authorization preemptively.

In SOAP UI my Request looks like this:

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)

When I try watching my .Net code through Fiddler, I'm not seeing the Content-Type being passed from the .Net Application. Is there something I'm missing there? Or is it possible I do need to pass the call in chunks?

When SendChunked = true, I get the error: Content-Length or Chunked Encoding cannot be set for an operation that does not write data

When I try passing data, I get the Error: Cannot send a content-body with this verb-type

A few things I've tried:

  • Modifying AutomaticDecompression
  • Modifying the Security Protocol
  • Transfer Encoding gzip,deflate
  • Enable/Disable Auto Redirect
  • And several variations of: Accept, KeepAlive, UserAgent, CachePolicy, ProtocolVersion

Perhaps It's not possible with the HttpWebRequest. Is there a better method I should try employing?

My Final requirements are to get data back from this call, then kick off other .Net processes.


Solution

  • This sounds like a TLS 1.2 issue, especially since it works in Postman, but not in .Net. Older versions of .Net don't automatically use TLS 1.2 and try to authenticate using older protocols and promptly get rejected.

    There are lots of fixes for this one, either registry on the server, or app specific, but you should understand what you are doing first so you don't shoot yourself in the foot. I suggest reading this article and trying some of the fixes.

    Stack Overflow discussion