c# - 一个用于应用程序实例的 http 客户端
问题描述
我正在尝试在 .net core 3.0 中尽可能高效地使用 http 客户端,但它似乎仍然为每个服务使用一个客户端,例如,我有以下 StockSevices 类,它将容纳我所有与股票有关的调用,我正在使用 asp目前.net core 3.0
public class StockServices
{
public HttpClient Client { get; }
public StockServices(HttpClient client)
{
client.BaseAddress = new Uri(Constants.BaseApiUrl);
// GitHub API versioning
// GitHub requires a user-agent
client.DefaultRequestHeaders.Add("User-Agent",
"HttpClientFactory-Sample");
Client = client;
}
public async Task<IEnumerable<RoundTableERPDal.Models.Stock>> GetAspNetDocsIssues()
{
var response = await Client.GetAsync(
"/Stock/All");
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<IEnumerable<RoundTableERPDal.Models.Stock>>(result);
}
我已将它放在我的启动文件中,但我没有得到的是如何传递全局 HTTP 客户端,因为我们打算使用同一个客户端来阻止对打开的许多端口的调用降级。
在我的启动 cs.
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.Configure<ConnectionStringConfig>(Configuration);
services.AddHttpClient("externalservice", c =>
{
// Assume this is an "external" service which requires an API KEY
c.BaseAddress = new Uri("https://localhost:5001/");
});
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "Api For RoundTable A Complete ERP for warehouse managment", Version = "v1" });
});
}
解决方案
当您需要的是Typed客户端时,您添加了一个Named客户端
//...
services.AddHttpClient<StockServices>(client => {
// Assume this is an "external" service which requires an API KEY
client.BaseAddress = new Uri(Constants.BaseApiUrl);
// GitHub API versioning
// GitHub requires a user-agent
client.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
});
//...
如果StockServices
最终被抽象化,则可以对其接口进行相同的操作
services.AddHttpClient<IStockServices, StockServices>(client => {
// Assume this is an "external" service which requires an API KEY
client.BaseAddress = new Uri(Constants.BaseApiUrl);
// GitHub API versioning
// GitHub requires a user-agent
client.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
});
服务的样子
public class StockServices: IStockServices {
private readonly HttpClient client;
public StockServices(HttpClient client) {
this.client = client;
}
public async Task<IEnumerable<RoundTableERPDal.Models.Stock>> GetAspNetDocsIssues() {
using(var response = await client.GetAsync("/Stock/All")) {
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<IEnumerable<RoundTableERPDal.Models.Stock>>(result);
}
}
}
参考如何通过 HttpClientFactory 使用类型化客户端
推荐阅读
- python-3.x - 使用 tf.data.experimental.CsvDataset 更新已弃用的 tensorflow 数据集滑动窗口的指令
- sequence - 填充包含 NaN 的序列
- javascript - 使用 JSON 坐标在传单地图上绘制国家边界
- java - 应用程序代码中的逻辑问题 - 总和不正确
- c - 从 C 中的文本文件中读取逗号分隔的数字(坐标)
- python - 字符 b 附加到 numpy 数组的输出?
- python - 如何使用列表和字典将字符串转换为二进制代码
- reactjs - 创建 React App V2 - 多个入口点
- android - 错误:无法解决:com.google.firebase:firebase-core:16.1.0
- javascript - 换行 TextArea 默认值