gpt4 book ai didi

c# - HttpClientFactory BadRequest?

转载 作者:太空宇宙 更新时间:2023-11-03 22:43:37 26 4
gpt4 key购买 nike

我需要使用 HttpClientFactory 来连接到外部 api。Startup.cs 中的代码如下所示

public void SetUpHttpClients(IServiceCollection services)
{
var loginEndpoint = Path.Combine(baseApi, "api/authentication);
var fileExists = File.Exists(certificatePath);

if (!fileExists)
throw new ArgumentException(certificatePath);

var certificate = new X509Certificate2(certificatePath, certPwd);

services.AddHttpClient("TestClient", client =>
{
client.BaseAddress = new Uri(baseApi);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(accept));
client.DefaultRequestHeaders.Add("ApiKey", apiKey);

var body = new { Username = username, Password = password };
var jsonBody = JsonConvert.SerializeObject(body);
var content = new StringContent(jsonBody, Encoding.UTF8, contentType);

var loginResponse = client.PostAsync(loginEndpoint, content).Result;

}).ConfigurePrimaryHttpMessageHandler(() =>
{
var cookieContainer = new CookieContainer();
var handler = new HttpClientHandler
{
CookieContainer = cookieContainer
};
handler.ClientCertificates.Add(certificate);
return handler;
});

我已经使用 HttpClientFactory 在 MessageController 中添加了这段代码,

public class MessagesController : Controller
{
private readonly IHttpClientFactory _httpClientFactory;

public ValuesController(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}

[HttpGet]
public IActionResult GetMessages()
{
var client = _httpClientFactory.CreateClient("TestClient");
var result = client.GetStringAsync("/api/messages");
return Ok(result);
}
}

但是当我尝试连接并从 HttpClientFactory 获取消息时,出现此错误:

Failed to load resource: net::ERR_CONNECTION_RESET, 404 - BadRequest

最佳答案

您尝试在完成工厂配置之前发出请求,该帖子将失败,因为您在尝试使用客户端的同时仍在配置它。

此处假设 SetUpHttpClientsConfigureServices 中被调用。

public void ConfigureServices(IServiceCollection services) {
//...

SetUpHttpClients(services);

//...

services.AddMvc();
}

public void SetUpHttpClients(IServiceCollection services) {
var basePath = Directory.GetCurrentDirectory();
var certificatePath = Path.Combine(basePath, certPath);
var fileExists = File.Exists(certificatePath);

if (!fileExists)
throw new ArgumentException(certificatePath);

var certificate = new X509Certificate2(certificatePath, certPwd);

//Adding a named client
services.AddHttpClient("TestClient", client => {
client.BaseAddress = new Uri(baseApi);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(accept));
client.DefaultRequestHeaders.Add("ApiKey", apiKey);
})
.ConfigurePrimaryHttpMessageHandler(() => {
var cookieContainer = new CookieContainer();
var handler = new HttpClientHandler {
CookieContainer = cookieContainer
};
handler.ClientCertificates.Add(certificate);
return handler;
});
}

完成配置后,可以根据需要将工厂注入(inject)到 Controller 或服务类中。

以下示例显示了将工厂用作 Controller 的依赖项。

[Route("api/[controller]")]
public class ValuesController : Controller {
private readonly IHttpClientFactory factory;

public MyController(IHttpClientFactory factory) {
this.factory = factory;
}

[HttpGet]
public async Task<IActionResult> Get() {
var client = factory.CreateClient("TestClient");
var result = client.GetStringAsync("api/messages");
return Ok(result);
}
}

在上面,工厂用于创建指定客户端的实例。它将具有启动期间设置的所有配置,其中包括带有证书的客户端处理程序。

为了能够在启动期间使用客户端(我不建议这样做),您首先需要将服务集合构建到服务提供者中。

var serviceProvider = services.BuildServiceProvider();
var factory = serviceProvider.GetService<IHttpClientFactory>();
var client = factory.CreateClient("TestClient");

var body = new { Username = username, Password = password };
var jsonBody = JsonConvert.SerializeObject(body);
var content = new StringContent(jsonBody, Encoding.UTF8, contentType);

var loginResponse = client.PostAsync("api/authentication", content).Result;

//...do something with the response

然而,这可能会产生无法预料的结果,因为在启动过程的这个阶段服务集合不会被完全填充。

关于c# - HttpClientFactory BadRequest?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51009482/

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