1. ホーム
  2. c#

[解決済み] HttpClientを使用してhttpsを呼び出す

2022-04-20 18:49:09

質問

私はこれまで HttpClient C# を使って WebApi を呼び出すためのものです。と比べても、とてもすっきりしているように見える。 WebClient . しかし、私は Https を呼び出します。

以下のコードで Https を呼び出すことができますか?

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

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

EDIT 1: 上記のコードはhttpで呼び出す場合は問題なく動作します。しかし、スキームをhttpsに変更すると、うまくいきません。以下は、得られたエラーです。

基礎となる接続が閉じられました。信頼関係を確立できませんでした。 の関係は、SSL/TLS セキュアチャネルになります。

EDIT 2: スキームをhttpsに変更するのは:ステップ1。

<ブロッククオート

証明書と公開鍵・秘密鍵をC#で提供するには? をリクエストしてください。

解決方法は?

サーバーがTLS 1.2のような高いTLSバージョンしかサポートしていない場合、クライアントPCがデフォルトで高いTLSバージョンを使用するように設定されていない限り、失敗します。この問題を解決するには、次のコードを追加してください。

System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

あなたのコード例を修正すると、次のようになります。

HttpClient httpClient = new HttpClient();   

//specify to use TLS 1.2 as default connection
System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

httpClient.BaseAddress = new Uri("https://foobar.com/");
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
    
var task = httpClient.PostAsXmlAsync<DeviceRequest>("api/SaveData", request);