HttpCompletionOption Перечисление
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Указывает, следует ли считать HttpClient операции завершенными как только ответ будет доступен, либо после чтения всего сообщения ответа, включая содержимое.
public enum class HttpCompletionOption
public enum HttpCompletionOption
type HttpCompletionOption =
Public Enum HttpCompletionOption
- Наследование
Поля
| Имя | Значение | Описание |
|---|---|---|
| ResponseContentRead | 0 | Операция должна завершиться после чтения всего ответа, включая содержимое. |
| ResponseHeadersRead | 1 | Операция должна завершиться, как только ответ доступен, и заголовки считываются. Содержимое еще не прочитано. |
Комментарии
Предупреждение
Значение HttpCompletionOption влияет на область времени ожидания, указанного в HttpClient параметрах при чтении ответа. Время ожидания HttpClient всегда применяется к соответствующим вызываемым методам до точки завершения и возврата этих методов. Важно, что при использовании ResponseHeadersRead параметра время ожидания применяется только к тому, где заканчиваются заголовки и начинается содержимое. Операция чтения содержимого должна быть отложена отдельно, если сервер быстро возвращает строку состояния и заголовки, но занимает слишком много времени, чтобы вернуть содержимое. Это также относится к свойству MaxResponseContentBufferSize . Ограничение применяется только при использовании ResponseContentRead. Ниже приведен пример, демонстрирующий эту точку:
using var httpClient = new HttpClient();
httpClient.Timeout = TimeSpan.FromSeconds(30);
httpClient.MaxResponseContentBufferSize = 1_000; // This will be ignored
// Because we're specifying the ResponseHeadersRead option,
// the 30-second timeout applies only up until the headers are received.
// It does not affect future operations that interact with the response content.
using HttpResponseMessage response = await httpClient.GetAsync(
"http://localhost:12345/",
HttpCompletionOption.ResponseHeadersRead);
// Do other checks that don't rely on the content first, like status code validation.
response.EnsureSuccessStatusCode();
// Since the HttpClient.Timeout will not apply to reading the content,
// you must enforce it yourself, for example by using a CancellationTokenSource.
using var cancellationSource = new CancellationTokenSource(TimeSpan.FromSeconds(15));
// If you wish to enforce the MaxResponseContentBufferSize limit as well,
// you can do so by calling the LoadIntoBufferAsync helper first.
await response.Content.LoadIntoBufferAsync(1_000, cancellationSource.Token);
// Make sure to pass the CancellationToken to all methods.
string content = await response.Content.ReadAsStringAsync(cancellationSource.Token);