Многократная реализация HttpClient - PullRequest
0 голосов
/ 15 октября 2018

Сценарий:

Мне нужно загрузить рабочие элементы из двух систем управления проектами (VSTS и Jira) через их REST API.У каждого из них свой механизм авторизации:

  • VSTS: использование токена доступа, загружаемого из базы данных, в зависимости от команды / группы пользователей
  • Jira: использование персонального токена, загружаемого из утверждений пользователя, варьируется пользователем

Основные классы и интерфейс:

public interface IProjectManagementClient
{
    ProjectManagementType Type { get; }
    Task<WorkItem> GetWorkItemAsync(ProjectManagement projectManagement, int id, CancellationToken token = default(CancellationToken));
    Task<List<WorkItem>> GetAllWorkItemsAsync(ProjectManagement projectManagement, string term, int limit = 10, CancellationToken token = default(CancellationToken));
}

public enum ProjectManagementType
{
    VSTS,
    Jira
}

public class ProjectManagement
{
    public int Id { get; set; }
    public ProjectManagementType Type { get; set; }
    public string BaseAddress { get; set; }
    public string AccessToken { get; set; }
}

Настройка:

services.AddHttpClient<IProjectManagementClient, VstsClient>();
services.AddHttpClient<IProjectManagementClient, JiraClient>()
    .AddHttpMessageHandler(provider => new BasicAuthHandler(provider.GetService<IHttpContextAccessor>(), CustomClaimTypes.TrackerToken));

Пример использования:

public TimesheetsController(IEnumerable<IProjectManagementClient> projectManagementClients)
{
    _projectManagementClients = projectManagementClients;
}

public void DoWork()
{
    foreach (var timesheet in _timesheets)
    {
        var projectManagementClient = _projectManagementClients.First(o => o.Type == timesheet.ProjectManagement.Type);
        timesheet.WorkItem = timesheet.WorkItemId.HasValue
            ? await projectManagementClient.GetWorkItemAsync(timesheet.ProjectManagement, timesheet.WorkItemId.Value, token)
            : null;
    }
}

Проблемы:

Несмотря на то, что я только зарегистрировал BasicAuthHandler на JiraClient.Он был применен как к клиентам VSTS, так и к клиентам Jira.

Таким образом, он переопределил авторизацию VSTS, которая была установлена ​​ранее в VstsClient.

Оба работают нормально, если я только настраиваюсьи использовать только их одновременно.Пожалуйста, помогите.

1 Ответ

0 голосов
/ 15 октября 2018

JiraClient переопределяется на VstsClient, потому что они оба зарегистрированы на одно и то же (нулевое) имя, которое используется по умолчанию.Попробуйте использовать именованные регистрации:

services.AddHttpClient<IProjectManagementClient, VstsClient>("VSTS");
services.AddHttpClient<IProjectManagementClient, JiraClient>("JIRA")
    .AddHttpMessageHandler(provider => new BasicAuthHandler(
        provider.GetService<IHttpContextAccessor>(),
        CustomClaimTypes.TrackerToken));

В этом случае IEnumerable<IProjectManagementClient> должно дать два элемента, настроенных, как указано выше, без переопределения.

...