Abhijeet Abhijeet - 4 months ago 295
C# Question

Make Https call using HttpClient

I have been using

HttpClient
for making WebApi calls using C#. Seems neat & fast way compared to
WebClient
. However I am stuck up while making
Https
calls.

How can I make below code to make
Https
calls?

HttpClient httpClient = new HttpClient();
httpClient.BaseAddress = new Uri("http://foobar.com/");
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));

var task = httpClient.PostAsXmlAsync<DeviceRequest>("api/SaveData", request);


EDIT:
Above code works fine for making http calls. But when I change the scheme to https it does not work. Here is the error obtained:


The underlying connection was closed: Could not establish trust
relationship for the SSL/TLS secure channel.


EDIT 2:
Changing the scheme to https is: step one.


How do I supply certificate & public / private key along with C#
request.

Answer

Simply specify HTTPS in the URI.

new Uri("https://foobar.com/");

Foobar.com will need to have a trusted SSL cert or your calls will fail with untrusted error.

EDIT Answer: ClientCertificates with HttpClient

WebRequestHandler handler = new WebRequestHandler();
X509Certificate2 certificate = GetMyX509Certificate();
handler.ClientCertificates.Add(certificate);
HttpClient client = new HttpClient(handler);

EDIT Answer2: If the server you are connecting to has disabled SSL, TLS 1.0, and 1.1 and you are still running .NET framework 4.5(or below) you need to make a choice

  1. Upgrade to .Net 4.6+ (Supports TLS 1.2 by default)
  2. Add registry changes to instruct 4.5 to connect over TLS1.2 (checkout IISCrypto see Ronald Ramos comments below)
  3. Add application code to manually configure .NET to connect over TLS1.2 (see Ronald Ramos below)