Search code examples
c#.netasynchronousurlencode

HttpClient post async form-url-encoded and string content not working


I am trying to use System.Net.Http.HttpClient PostAsync method to make an API call. It hangs forever after await _httpClient.PostAsync(requestUri, stringContent);.

HttpClient configuration :

_httpClient = new System.Net.Http.HttpClient(new HttpClientHandler
            {
                UseDefaultCredentials = WithDefaultCredentials,
                AllowAutoRedirect = false
            });

_httpClient.DefaultRequestHeaders.Accept.Clear();
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(APPLICATION_JSON));
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(ApplicationXWwwFormUrlencoded));
if (!string.IsNullOrEmpty(CultureInfo.CurrentUICulture.Name))
{
     _httpClient.DefaultRequestHeaders.AcceptLanguage.Add(new 
     StringWithQualityHeaderValue(CultureInfo.CurrentUICulture.Name));
}

PostAsync call :

var stringContent = new StringContent(content);
stringContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/x-www-form-urlencoded");
var response = await _httpClient.PostAsync(requestUri, stringContent);
var responseContent = await response.Content.ReadAsStringAsync();

Solution

  • Using FormUrlEncodedContent instead of string content fixed my problem :

    var requestContent = new FormUrlEncodedContent(new[]
                {
                    new KeyValuePair<string, string>("password", password),
                    new KeyValuePair<string, string>("username", username),
                    // ...
                });
    var response = await _httpClient.PostAsync(requestUri, requestContent);
    var responseContent = await response.Content.ReadAsStringAsync();