web-dev-qa-db-ja.com

.NETHttpClientリクエストのコンテンツタイプ

よくわかりませんが、.NETHttpClientライブラリのデフォルトの実装に欠陥があるようです。 PostAsJsonAsync呼び出しでContent-Typeリクエスト値を "text/html"に設定しているようです。リクエスト値をリセットしようとしましたが、これが正しく行われているかどうかわかりません。助言がありますか。

public async Task<string> SendPost(Model model)
{
    var client = new HttpClient();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    var response = await client.PostAsJsonAsync(Url + "api/foo/", model);
    response.EnsureSuccessStatusCode();
    return await response.Content.ReadAsStringAsync();    
}
6
user167698

コンテンツタイプを設定する必要があります。 Acceptを使用して、応答として必要なものを定義します。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html Accept request-headerフィールドを使用して、応答に受け入れられる特定のメディアタイプを指定できます。 Acceptヘッダーを使用して、インラインイメージのリクエストの場合のように、リクエストが特定のタイプの小さなセットに限定されていることを示すことができます。

public async Task<string> SendPost(Model model)
{
    var client = new HttpClient(); //You should extract this and reuse the same instance multiple times.
    var request = new HttpRequestMessage(HttpMethod.Post, Url + "api/foo");
    using(var content = new StringContent(Serialize(model), Encoding.UTF8, "application/json"))
    {
        request.Content = content;
        var response = await client.SendAsync(request).ConfigureAwait(false);
        response.EnsureSuccessStatusCode();
        return await response.Content.ReadAsStringAsync().ConfigureAwait(false);
    }
}
7
Edwin van Vliet