1. ホーム
  2. c#

[解決済み] HttpClientのBaseAddressが機能しないのはなぜですか?

2022-03-22 18:09:45

質問

次のコードを考えてみましょう。 BaseAddress は部分的なURIのパスを定義している。

using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
    client.BaseAddress = new Uri("http://something.com/api");
    var response = await client.GetAsync("/resource/7");
}

を実行することを期待しています。 GET へのリクエストは http://something.com/api/resource/7 . でも、そうならない。

いろいろ検索した結果、こんな質問と回答がありました。 HttpClientとBaseAddress . 提案では / の末尾にある BaseAddress .

using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
    client.BaseAddress = new Uri("http://something.com/api/");
    var response = await client.GetAsync("/resource/7");
}

まだうまくいきません。以下はそのドキュメントです。 HttpClient.BaseAddress どうなってるんだ?

解決方法は?

の末尾または先頭のスラッシュを含むか含まないかの4つの可能な組み合わせのうち、1つの組み合わせにしかならないことがわかりました。 BaseAddress に渡される相対URIと GetAsync メソッド -- あるいは、他のどのメソッドであっても HttpClient -- のみ の順列が機能します。 あなたは しなければならない の末尾にスラッシュを付けます。 BaseAddress で、あなたは はいけません。 は、次の例のように相対URIの先頭にスラッシュを置きます。

using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
    client.BaseAddress = new Uri("http://something.com/api/");
    var response = await client.GetAsync("resource/7");
}

自分自身の質問に答えたとはいえ、やはりこの不親切な動作は文書化されていないため、解決策をここに寄稿しようと思いました。同僚と私は一日中、最終的にこの奇妙な HttpClient .