Итак, большинство из нас, вероятно, читали, что мы должны повторно использовать экземпляры HttpClient
вместо использования using
и создания новых. Это означает, что я могу просто создать единственный экземпляр HttpClient
в своей программе и вызвать GetAsync
, используя полную строку uri для каждого запроса. Это приводит меня к свойству BaseAddress
HttpClient
. Рассмотрим следующий код:
HttpClient microsoftClient = new HttpClient() { BaseAddress = new Uri("https://www.microsoft.com/") };
HttpClient stackoverflowClient = new HttpClient() { BaseAddress = new Uri("https://stackoverflow.com/") };
var response = microsoftClient.GetAsync("about").Result;
Console.WriteLine($"I {((response.IsSuccessStatusCode) ? "can" : "cannot")} access microsoft.com/about from the microsoft client");
response = microsoftClient.GetAsync("trademarks").Result;
Console.WriteLine($"I {((response.IsSuccessStatusCode) ? "can" : "cannot")} access microsoft.com/trademarks from the microsoft client");
response = stackoverflowClient.GetAsync("company/about").Result;
Console.WriteLine($"I {((response.IsSuccessStatusCode) ? "can" : "cannot")} access stackoverflow.com/company/about from the stackoverflow client");
response = stackoverflowClient.GetAsync("https://www.microsoft.com/about").Result;
Console.WriteLine($"I {((response.IsSuccessStatusCode) ? "can" : "cannot")} access microsoft.com/about from the stackoverflow client");
microsoftClient.BaseAddress = new Uri("https://stackoverflow.com");
response = microsoftClient.GetAsync("company/about").Result;
Console.WriteLine($"I {((response.IsSuccessStatusCode) ? "can" : "cannot")} access stackoverflow.com/company/about from the microsoft client, after changing the BaseAddress");
Вплоть до последнего блока этот код работает нормально, даже при использовании клиента с stackoverflow BaseAddress
для доступа к Microsoft. Однако этот код выдает InvalidOperationException
в начале последнего блока при переназначении BaseAddress
, указывая
'This instance has already started one or more requests. Properties can only be modified before sending the first request.'
Это подводит меня к следующим вопросам:
- Какая вообще польза от использования
BaseAddress
? Я всегда мог использовать полный адрес в моемGetAsync
звонке. Это просто для удобства / производительности, так как не нужно создавать полную строку запроса? Я предполагал, что он создаст только одинServicePoint
внутри, как описано в первом абзаце это сообщение в блоге (или что-то подобное, поскольку сообщение довольно старое). - Что происходит внутри нас, когда мы не можем изменить свойство
HttpClient
, особенноBaseAddress
, после отправки первого запроса? Это кажется довольно неудобным, если использование этого свойства действительно приносит пользу.