gpt4 book ai didi

c# - 使用 HttpClient 的最佳实践

转载 作者:太空狗 更新时间:2023-10-29 18:09:09 26 4
gpt4 key购买 nike

我正在使用 HttpClient 向 WebApi 发出请求。

这段代码是我写的

 public async Task<string> ExecuteGetHttp(string url, Dictionary<string, string> headers = null)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(url);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
if (headers != null)
{
foreach (var header in headers)
{
client.DefaultRequestHeaders.Add(header.Key, header.Value);
}
}
var response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
}

现在我从我的操作中调用这个方法。

public async Task<ActionResult> Index()
{
try
{
RestWebRequest RestWebRequest = new RestWebRequest();
Dictionary<string, string> headers = new Dictionary<string, string>();
headers.Add("Authorization", "bearer _AxE9GWUO__8iIGS8stK1GrXuCXuz0xJ8Ba_nR1W2AhhOWy9r98e2_YquUmjFsAv1RcI94ROKEbiEjFVGmoiqmUU7qB5_Rjw1Z3FWMtzEc8BeM60WuIuF2fx_Y2FNTE_6XRhXce75MNf4-i0HbygnClzqDdrdG_B0hK6u2H7rtpBFV0BYZIUqFuJpkg4Aus85P8_Rd2KTCC5o6mHPiGxRl_yGFFTTL4_GvSuBQH39RoMqNj94A84KlE0hm99Yk-8jY6AKdxGRoEhtW_Ddow9FKWiViSuetcegzs_YWiPMN6kBFhY401ON_M_aH067ciIu6nZ7TiIkD5GHgndMvF-dYt3nAD95uLaqX6t8MS-WS2E80h7_AuaN5JZMOEOJCUi7z3zWMD2MoSwDtiB644XdmQ5DcJUXy_lli3KKaXgArJzKj85BWTAQ8xGXz3PyVo6W8swRaY5ojfnPUmUibm4A2lkRUvu7mHLGExgZ9rOsW_BbCDJq6LlYHM1BnAQ_W6LAE5P-DxMNZj7PNmEP1LKptr2RWwYt17JPRdN27OcSvZZdam6YMlBW00Dz2T2dgWqv7LvKpVhMpOtjOSdMhDzWEcf6yqr4ldVUszCQrPfjfBBtUdN_5nqcpiWlPx3JTkx438i08Ni8ph3gDQQvl3YL5psDcdwh0-QtNjEAGvBdQCwABvkbUhnIQQo_vwA68ITg07sEYgCl7Sql5IV7bD_x-yrlHyaVNtCn9C4zVr5ALIfj0YCuCyF_l1Z1MTRE7nb");
var getCategories = await RestWebRequest.ExecuteGetHttp("http://localhost:53646/api/Job/GetAllCategories?isIncludeChild=true", headers);
}
catch (HttpRequestException ex)
{
return View();
}
return View();
}

现在据说 HttpClient has been designed to be re-used for multiple calls .

如何对多个调用使用相同的 httpClient 对象。

假设首先我打电话

http://localhost:53646/api/Job/GetAllCategories?isIncludeChild=true

现在在同一个 Controller 中,我必须使用不同的 header 和不同的 url 调用另一个 Api。

http://localhost:53646/api/Job/category/10

我是否应该创建 HttpClient 的全局对象并为所有 API 调用使用相同的对象。

最佳答案

仅使用一个的挑战 HttpClient在您的应用程序中,当您想要使用不同的凭据或尝试更改请求的默认 header (或传入的 HttpClientHandler 中的任何内容)时。在这种情况下,您将需要一组特定用途的 HttpClient 来重复使用,因为仅使用一个会出现问题。

我建议根据您希望发出的请求的“类型”创建一个 HttpClient 并重新使用它们。例如。一个用于您需要的每个凭据 - 也许如果您有几组默认 header ,则每个 header 一个。

在 HttpClient 属性(不是线程安全的)之间可能有点杂耍,如果发生变化则需要它们自己的实例:

- BaseAddress
- DefaultRequestHeaders
- MaxResponseContentBufferSize
- Timeout

以及您可以传递给“VERB”方法的内容(get、put、post 等)。例如,使用 HttpClient.PostAsync Method (String, HttpContent) 您可以为 [HttpContent][3] 指定 header (而不必将它们放在 HttpClient 中默认 header )。

HttpClient 的所有异步方法都是线程安全的 (PostAsync) 等。

关于c# - 使用 HttpClient 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37157164/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com