Я использую .NET Core 2.1 для использования некоторых API. В моем Startup.cs я настраиваю именованный HttpClient следующим образом:
services.AddHttpClient("MyApi", client =>
{
client.BaseAddress = new Uri("https://foo.com");
});
Я хотел бы отключить автоматическое перенаправление после. Я знаю, что вы можете сделать это при создании нового HttpClient, передав SocketsHttpHandler с AllowAutoRedirect = false. Но при использовании вышеуказанного заводского шаблона я не вижу, где я могу это настроить, поскольку у меня нет доступа к конструкции HttpClient.
Свойство AllowAutoRedirect
принадлежит HttpMessageHandler
. При использовании подхода AddHttpClient
вы можете настроить сам HttpMessageHandler
, используя ConfigurePrimaryHttpMessageHandler
. Вот пример того, как использовать это:
services
.AddHttpClient("MyApi", client =>
{
client.BaseAddress = new Uri("https://foo.com");
})
.ConfigurePrimaryHttpMessageHandler(() =>
{
return new HttpClientHandler()
{
AllowAutoRedirect = false
};
});
Это описано в официальных документах: настройка HttpMessageHandler
Таким образом, вы можете настроить httpClient, как вы хотите
public interface ITwitterApiClient
{
Task<List<string>> GetTweets();
}
public class TwitterApiClient : ITwitterApiClient
{
public async Task<List<string>> GetTweets()
{
using (HttpClient client = new HttpClient())
{
//Blah blah do everything here I want to do.
//var result = await client.GetAsync("/tweets");
return new List<string> { "Tweet tweet" };
}
}
}
В определении сервиса
services.AddTransient<ITwitterApiClient, TwitterApiClient>();
В контроллере
[Route("api/[controller]")]
public class TweetController : Controller
{
private readonly ITwitterApiClient _twitterApiClient;
public TweetController(ITwitterApiClient twitterApiClient)
{
_twitterApiClient = twitterApiClient;
}
[HttpGet]
public async Task<IEnumerable<string>> Get()
{
return await _twitterApiClient.GetTweets();
}
}