【发布时间】:2018-06-24 11:28:40
【问题描述】:
我需要使用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 获取消息时,我收到此错误:
加载资源失败:net::ERR_CONNECTION_RESET, 404 - BadRequest
【问题讨论】:
-
快速提问,为什么要在完成出厂配置之前提出请求?该 Post 将失败,因为您仍在配置客户端时尝试使用它。
-
你能说明你实际需要在哪里使用客户端吗?在控制器或服务类中?这里的假设是
SetUpHttpClients在ConfigureServices中被调用。 -
是的,首先我想在 ConfigureServices 中使用,然后从控制器调用。
-
好吧,这感觉就像XY problem。澄清你真正想做的是什么,而不仅仅是你试图做的事情。这样可以得到更准确的答案。
标签: c# asp.net-core dotnet-httpclient httpclientfactory