web-dev-qa-db-ja.com

Content-Typeヘッダーを設定できません

HttpClientでContent-Typeを設定できません。私はこの質問に続けました: HttpClientリクエストのContent-Typeヘッダーをどのように設定しますか? しかし、まだ運がありません。

String rcString = JsonConvert.SerializeObject(new RoadsmartChecks() { userguid = user_guid, coords = coordinates, radius = (radius * 100) + "" }, ROADSMART_JSON_FORMAT, JSONNET_SETTINGS);
HttpClient c = new HttpClient();
c.BaseAddress = new Uri(BASE_URL);
c.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json"); //Keeps returning false
c.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", hash_aes);
c.DefaultRequestHeaders.TryAddWithoutValidation("Roadsmart-app", Constant.APP_ID);
c.DefaultRequestHeaders.TryAddWithoutValidation("Roadsmart-user", user_guid);
c.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Post, BASE_URL + URL_CHECKS + "/fetch");
req.Content = new StringContent(rcString);
await c.SendAsync(req).ContinueWith(respTask =>
{
    Debug.WriteLine("Response: {0}", respTask.Result);
});

Debugger Flurlライブラリを使用してみましたが、「Content-Type」を追加しようとするとクラッシュします。

misused header name content-type

では、どうすればそれを強制して、本当に追加できるのでしょうか。前もって感謝します。

13
tim

あなたはこれを試すべきだと思います

_req.Content = new StringContent(rcString, Encoding.UTF8, "application/json");
_

このリンクをチェックアウト:

HttpClientリクエストのContent-Typeヘッダーをどのように設定しますか?

編集する

この行を削除してc.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");をチェックし、

25
Ajay

UPDATE:デフォルト以外のコンテンツタイプについては 新しい回答 を参照してください

Flurlでは、PostJsonAsyncのようなメソッドのContent-Typeをapplication/jsonに設定する必要はありません。この場合、これがデフォルトのコンテンツタイプであり、設定されます。

3
Todd Menier

これに対するFlurlの最新かつ最大の答えは pgrade です。 2.0では、ヘッダーdeptにいくつかの拡張機能が導入されています。

  1. それらはもはや検証されていません。 Flurlは内部でTryAddWithoutValidationを使用するようになったため、WithHeader(s)メソッドで「誤用されたヘッダー名」エラーが発生することはありません。 (私は常に検証動作が少し過保護であることを発見しました。)

  2. 流暢な呼び出しでは、FlurlClientレベルではなく個々のリクエストレベルで設定されるため、クライアントを再利用するときに 同時実行の問題 に遭遇することはありません。

  3. ヘッダー名ではハイフンが一般的ですが、C#識別子では使用できないため、アンダースコアがハイフンに変換される 新しい規則 があり、複数を指定するときにオブジェクト表記をあきらめる必要はありません。

    url.WithHeaders(new { Content_Type = "foo", ... }
    
1
Todd Menier