.NET HttpClient
クラス(.NET 4.5.1、System.Net.Http v4.0.0.0)の問題が発生しました。私はCancellationToken
(Webサービス間で呼び出しを抽象化するNugetパッケージの一部として)を渡してHttpClient.GetAsync
と呼んでいます。呼び出しが行われる前にトークンが取り消された場合、要求は例外をスローすることなく処理されます。この現象は正しいとは思われません。.NET HttpClient - CancellationTokenキャンセルのキャンセルをキャンセルしました
私のテスト(不完全、完全に書かれていない - 例外なくチェック):
[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);
}
私がテストだ方法:
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
{
// After this, we really shouldn't continue.
var request = await _httpClient.GetAsync(builder.Uri, cancellationToken);
if (!request.IsSuccessStatusCode)
{
if (request.StatusCode >= HttpStatusCode.BadRequest && request.StatusCode < HttpStatusCode.InternalServerError)
{
throw new EndpointClientException("Service responded with an error message.", request.StatusCode, request.ReasonPhrase);
}
if (request.StatusCode >= HttpStatusCode.InternalServerError && (int)request.StatusCode < 600)
{
throw new EndpointServerException("An error occurred in the Service endpoint.", request.StatusCode, request.ReasonPhrase);
}
}
var json = await request.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<T>(json);
}
catch (Exception ex)
{
throw;
}
}
私がキャンセルのステータスを確認することができますことを知っていますトークンを呼び出してからHttpClient.GetAsync
を呼び出し、取り消しが要求された場合はスローします。私は、HttpClientリクエストをキャンセルする代理人を登録することもできます。しかし、トークンをHttpClientメソッドに渡すことで、私のためにこれを処理する必要があります(または、何がポイントなのでしょうか?)だから、何か不足しているのだろうかと思っています。私はHttpClient
ソースコードにアクセスすることはできません。
なぜ、HttpClient.GetAsync
は、キャンセルトークンを確認せず、渡したときにそのプロセスを中止しないのですか?
CancellationTokenが返すHTTPエラーコードを教えてください。 –