Переоборудовать клиент, используя динамический базовый адресC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Переоборудовать клиент, используя динамический базовый адрес

Сообщение Anonymous »

Я использую Refit для вызова API с использованием типизированного клиента в ядре asp.net 2.2, который в настоящее время загружается с использованием одного базового адреса из наших параметров конфигурации:

services.AddRefitClient()
.ConfigureHttpClient(c => { c.BaseAddress = new Uri(myApiOptions.BaseAddress);})
.ConfigurePrimaryHttpMessageHandler(() => NoSslValidationHandler)
.AddPolicyHandler(pollyOptions);


В нашей конфигурации json:

"MyApiOptions": {
"BaseAddress": "https://server1.domain.com",
}


В нашем интерфейсе IMyApi:

public IMyAPi interface {
[Get("/api/v1/question/")]
Task GetQuestionsAsync([AliasAs("document_type")]string projectId);
}


Пример текущей услуги:

public class MyProject {
private IMyApi _myApi;
public MyProject (IMyApi myApi) {
_myApi = myApi;
}

public Response DoSomething(string projectId) {
return _myApi.GetQuestionsAsync(projectId);
}
}


Теперь мне необходимо использовать разные базовые адреса на основе данных во время выполнения. Насколько я понимаю, Refit добавляет один экземпляр HttpClient в DI, и поэтому переключение BaseAddresses во время выполнения не будет напрямую работать в многопоточном приложении. Сейчас очень просто внедрить экземпляр IMyApi и вызвать метод интерфейса GetQuestionsAsync. В этот момент уже слишком поздно устанавливать BaseAddress. Если у меня несколько базовых адресов, есть ли простой способ динамически выбрать один из них?

Пример конфигурации:

"MyApiOptions": {
"BaseAddresses": {
"BaseAddress1": "https://server1.domain.com",
"BaseAddress2": "https://server2.domain.com"
}
}


Пример будущего обслуживания:

public class MyProject {
private IMyApi _myApi;
public MyProject (IMyApi myApi) {
_myApi = myApi;
}

public Response DoSomething(string projectId) {
string baseUrl = SomeOtherService.GetBaseUrlByProjectId(projectId);

return _myApi.UseBaseUrl(baseUrl).GetQuestionsAsync(projectId);
}
}


ОБНОВЛЕНИЕ
На основании принятого ответа я получил следующее:

public class RefitHttpClientFactory : IRefitHttpClientFactory
{
private readonly IHttpClientFactory _clientFactory;

public RefitHttpClientFactory(IHttpClientFactory clientFactory)
{
_clientFactory = clientFactory;
}

public T CreateClient(string baseAddressKey)
{
var client = _clientFactory.CreateClient(baseAddressKey);

return RestService.For(client);
}
}


Подробнее здесь: https://stackoverflow.com/questions/586 ... se-address
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»