I am having a problem with the .NET HttpClient class (.NET 4.5.1, System.Net.Http v4.0.0.0). I call HttpClient.GetAsync passing in a CancellationToken (as part of a Nuget package that abstracts calls between webservices). If the token was canceled before the call, the request passes without exception. This behavior does not seem correct.
My test (incomplete, not completely written - without checking the exception):
[TestMethod] public async Task Should_Cancel_If_Cancellation_Token_Called() { var endpoint = "nonexistent"; var cancellationTokenSource = new CancellationTokenSource(); var _mockHttpMessageHandler = new MockHttpMessageHandler(); _mockHttpMessageHandler .When("*") .Respond(HttpStatusCode.OK); var _apiClient = new ApiClientService(new HttpClient(_mockHttpMessageHandler)); cancellationTokenSource.Cancel(); var result = await _apiClient.Get<string>(endpoint, null, cancellationTokenSource.Token); }
The method I am testing is:
public async Task<T> Get<T>(string endpoint, IEnumerable<KeyValuePair<string, string>> parameters = null, CancellationToken cancellationToken = default(CancellationToken)) { var builder = new UriBuilder(Properties.Settings.Default.MyEndpointHost + endpoint); builder.Query = buildQueryStringFromParameters(parameters); _httpClient.DefaultRequestHeaders.Accept.Clear(); _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); try {
I know that I can check the status of the cancellation token before calling HttpClient.GetAsync and throw it if cancellation is requested. I know that I can register a delegate to cancel the HttpClient request. However, it seems that passing the marker to the HttpClient method should take care of this for me (or, what else, what is it?), So I wonder if I am missing something. I do not have access to the HttpClient source code.
Why HttpClient.GetAsync n't HttpClient.GetAsync check the cancel token and interrupt its process when I pass it?
source share