这是类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之类的属性并发出请求,你就不能随后改变这些属性。所以单身人士是好的,但只有当你设置属性一次。 –