private async Task<string> SendHttpRequestAsync(ISerializationContextProvider serializationContextProvider,
string uri,
string httpMethod,
object requestBodyEntity,
TypeSpec requestBodyBaseType,
RequestOptions options)
{
byte[] requestBytes = null;
HttpResponseMessage response = null;
if (requestBodyEntity != null)
{
requestBytes = this.serializerFactory
.GetSerializer(serializationContextProvider)
.SerializeToBytes(requestBodyEntity, new SerializeOptions
{
ExpectedBaseType = requestBodyBaseType
});
}
var request = new HttpRequestMessage(new System.Net.Http.HttpMethod(httpMethod), uri);
string responseString = null;
Exception thrownException = null;
try
{
if (options != null)
options.ApplyRequestModifications(request);
AddDefaultHeaders(request);
const string jsonContentType = "application/json; charset=utf-8";
request.Headers.Add("Accept", jsonContentType);
if (requestBytes != null)
{
var requestContent = new ByteArrayContent(requestBytes);
requestContent.Headers.ContentType = MediaTypeHeaderValue.Parse(jsonContentType);
request.Content = requestContent;
}
using (Profiler.Step("client: " + request.Method + " " + request.RequestUri))
{
response = await WebClient.SendAsync(request, CancellationToken.None);
}
if (response.Content != null)
{
responseString = await response.Content.ReadAsStringAsync();
if (responseString.Length == 0)
responseString = null;
}
if ((int)response.StatusCode >= 400)
{
var gotJsonResponseBody = responseString != null && response.Content.Headers.ContentType.MediaType == "application/json";
var responseObject = gotJsonResponseBody
? Deserialize(responseString, null, serializationContextProvider)
: null;
throw WebClientException.Create(this.typeMapper, request, response, responseObject, null);
}
}
catch (Exception ex)
{
thrownException = ex;
throw;
}
finally
{
var eh = RequestCompleted;
if (eh != null)
{
// Since request content has been disposed at this point we recreate it..
if (request.Content != null)
{
var nonDisposedContent = new ByteArrayContent(requestBytes);
nonDisposedContent.Headers.CopyHeadersFrom(request.Content.Headers);
request.Content = nonDisposedContent;
}
eh(this, new ClientRequestLogEventArgs(request, response, thrownException));
}
}
return responseString;
}