Удалить / добавить 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 вокруг.

Другие вопросы по тегам