這是類HttpClient .Net Core Source的設計。
這裏有趣的方法是CheckDisposedOrStarted()
。
private void CheckDisposedOrStarted()
{
CheckDisposed();
if (_operationStarted)
{
throw new InvalidOperationException(SR.net_http_operation_started);
}
}
現在這個設置屬性
BaseAddress
Timeout
MaxResponseContentBufferSize
所以,如果你打算重用HttpClient
情況下,你應該在被稱爲設置一個預設這些的單個實例3屬性和所有用途必須不是修改這些屬性。
另外,您可以創建工廠或使用簡單的AddTransient(...)
。請注意,AddScoped
不適合此處,因爲您將按請求範圍接收相同的實例。
編輯基本廠
現在工廠無非就是負責向其他服務提供實例的服務更多。這是一個基本的工廠建立你HttpClient
現在認識到這僅僅是最基本的,你可以擴展這個工廠爲什麼我用做你的願望和預先設置的HttpClient
public interface IHttpClientFactory
{
HttpClient CreateClient();
}
public class HttpClientFactory : IHttpClientFactory
{
static string baseAddress = "http://example.com";
public HttpClient CreateClient()
{
var client = new HttpClient();
SetupClientDefaults(client);
return client;
}
protected virtual void SetupClientDefaults(HttpClient client)
{
client.Timeout = TimeSpan.FromSeconds(30); //set your own timeout.
client.BaseAddress = new Uri(baseAddress);
}
}
現在每個實例和接口?這是通過使用依賴注入和IoC完成的,我們可以非常容易地將部分應用程序輕鬆「交換」。現在,我們不是試圖訪問HttpClientFactory
,而是訪問IHttpClientFactory
。
services.AddScoped<IHttpClientFactory, HttpClientFactory>();
現在在你的類,服務或控制器中,你會請求工廠接口並生成一個實例。
public HomeController(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
readonly IHttpClientFactory _httpClientFactory;
public IActionResult Index()
{
var client = _httpClientFactory.CreateClient();
//....do your code
return View();
}
這裏的關鍵是。
- 工廠負責生成客戶端實例並管理默認值。
- 我們正在請求接口而不是實現。這有助於我們保持組件斷開連接並允許更多模塊化設計。
- 該服務被註冊爲一個Scoped實例。單身人士有他們的用途,但在這種情況下,你更可能想要一個範圍實例。
爲每個請求創建一次作用域生命期服務。
也許發佈全班?我們目前不知道發生了什麼。 –
使用'AddScoped'來代替按請求獲取不同的實例。 – Kalten
消息很明確,一旦你設置了諸如BaseAddress之類的屬性併發出請求,你就不能隨後改變這些屬性。所以單身人士是好的,但只有當你設置屬性一次。 –