Удалить / добавить MessageHandlers во время выполнения
Как я могу добавить или удалить обработчики сообщений во время выполнения? Следующий пример не работает:
var logHandler = GlobalConfiguration.Configuration.MessageHandlers.FirstOrDefault(a => a.GetType() == typeof(ApiLogHandler));
if (logHandler == null)
{
GlobalConfiguration.Configuration.MessageHandlers.Add(new ApiLogHandler());
}
else
{
GlobalConfiguration.Configuration.MessageHandlers.Remove(logHandler);
}
Обработчик сообщений добавляется в список, но он не вызывается при следующих запросах...
1 ответ
Решение
Я бы вколол MessageHandler
в конфигурацию при запуске, специально созданную для динамического списка внутренних обработчиков сообщений и изменения интерфейса, из которого они используют DelegatingHandler
на заказ, например
public interface ICustomMessageHandler
{
Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken);
}
После этого вы можете создать стандарт MessageHandler
который содержит список внутренних обработчиков:
public class DynamicMessageHandler : DelegatingHandler
{
public List<ICustomMessageHandler> InnerHandlers { get; set; }
public DynamicMessageHandler()
{
InnerHandlers = new List<ICustomMessageHandler>();
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
foreach (var innerHandler in InnerHandlers)
{
await innerHandler.SendAsync(request, cancellationToken);
}
return await base.SendAsync(request, cancellationToken);
}
}
Таким образом, вы сможете изменить список InnerHandlers
во время выполнения, пока вы держите один экземпляр DynamicMessageHandler
вокруг.