I'm making 2 httpclient PostAsync calls to different URIs with the same content. If I do not serialize the StringContent a 2nd time, it seems my async Task never executes to completion. Please ignore the fact that i'm not using the 'await' operator on the async calls - unless that somehow affects the result. My understanding is that it shouldn't, but obviously if that's wrong, please help with my misconception?
private static List<string> validPackageType = new List<string>(new string[] { "A", "B", "C"});
private static shipmentValidationURL = "https://shipment.com.au/v1/shipmentvalidation";
private static shipmentURL = "https://shipment.com.au/v1/shipment";
public void Controller (){
PostContent();
logger.Trace("Sleep");
}
private async PostContent(){
var json = JsonConvert.SerializeObject(validPackageType );
var data = new StringContent(json, Encoding.UTF8, "application/json");
var datastring = data.ReadAsStringAsync().Result;
logger.Trace("data:{data}", datastring);
logger.Trace("Shipment validation Posting to:{shipmentValidationURL}", shipmentValidationURL);
var response = client.PostAsync(shipmentValidationURL, data);
var respcontent = response.Result.Content.ReadAsStringAsync().Result;
if (response.Result.IsSuccessStatusCode != true)
{
logger.Error("Validation Error:{errorxml}", respcontent);
return;
}
else
{
logger.Trace("Validation success");
}
logger.Trace("Calling Shipment Creation");
data = new StringContent(json, Encoding.UTF8, "application/json"); //2nd StringContent()
logger.Trace("data:{data}", datastring);
var result = client.PostAsync(shipmentURL, data);
var resultcontent = result.Result.Content.ReadAsStringAsync().Result;
logger.Trace("Calling Shipment done");
if (result.Result.IsSuccessStatusCode == true)
{
logger.Trace("Shipment success");
}else{
logger.Trace("Shipment failed");
}
}
Outputs:
The output WITHOUT the 2nd StringContent() call looks like:
11:01:07.1060 TRACE data:"{ A,B,C....}"
11:01:07.1060 TRACE Shipment validation Posting to:"https://shipment.com.au/v1/shipmentvalidation"
11:01:07.4680 TRACE Validation success
11:01:07.4680 TRACE Shipment update Posting to:"https://shipment.com.au/v1/shipment"
11:01:07.4680 TRACE Calling Shipment Creation
11:01:17.4865 TRACE Sleep
However if the 2nd StringContent call is made, it all executes as expected.
11:01:07.1060 TRACE data:"{ A,B,C....}"
11:01:07.1060 TRACE Shipment validation Posting to:"https://shipment.com.au/v1/shipmentvalidation"
11:01:07.4680 TRACE Validation success
11:01:07.4680 TRACE Shipment update Posting to:"https://shipment.com.au/v1/shipment"
11:01:07.4680 TRACE Calling Shipment Creation
11:01:07.1060 TRACE data:"{ A,B,C....}"
11:01:07.4680 TRACE Calling Shipment done
11:01:07.4680 TRACE Shipment success
11:01:17.4865 TRACE Sleep