I'm working on upgrading a very large legacy solution from .net 4.7 to .net 4.8. It's not been a problem on the whole but now all the projects are upgraded, I've got one failing unit test which is giving me cause for concern. No code has changed - only the framework versions.
The code that's being tested is this:
var httpRequestMessage = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri($"{this.options.Value.OurInternalObjectProperty}{this.licenseKey}&Content-Type=application-JSON"),
Headers =
{
{ HttpRequestHeader.Accept.ToString(), "application/json" },
{ "token", this.licenseKey },
{ "projectName", this.options.Value.OurInternalObjectProperty }
},
Content = new StringContent(JsonConvert.SerializeObject(ourObjectParameter))
};
using (var response = await this.httpClient.SendAsync(httpRequestMessage))
{
if (response.IsSuccessStatusCode)
{
var result = await this.DeserialiseObject<OurInternalObjectResult>(response);
return Task.FromResult(result).Result;
}
else
{
var requestHeaders = $"token: {this.licenseKey}, projectName: {this.options.Value.OurInternalObjectProperty }";
var requestBody = await httpRequestMessage.Content.ReadAsStringAsync();
var responseBody = await response.Content.ReadAsStringAsync();
this.logger.LogWarning(message: $"Our error message");
throw new OurCustomExceptionClass(responseBody, (int)response.StatusCode);
}
}
The unit test that's failing mocks the HttpResponseObject to return a 404, and checks that the method throws an exception of type OurCustomExceptionClass.
What's worrying me is that instead of that exception, the code is now throwing an System.ObjectDisposedException at httpRequestMessage.Content.ReadAsStringAsync(). The full error message is:
'Cannot access a disposed object. Object name: 'System.Net.Http.StringContent'.'
So I'm concerned there's been a change in how System.Net.Http handles and maintains requests between 4.7 and 4.8 which might be impactful in active usage.
Can anyone explain if there has been such a change, and why it's causing this test to fail? Is it something I need to worry about for live use, or can I just fix the test and move on?