Remove/add 运行时的 MessageHandlers

Remove/add MessageHandlers at runtime

如何在运行时添加或删除消息处理程序? 以下示例不起作用:

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);
}

消息处理程序已添加到列表中, 但在接下来的请求中不会调用它...

我会在启动时将一个 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 的实例。