在运行时删除/添加MessageHandlers

时间:2016-05-17 13:23:56

标签: asp.net-web-api asp.net-web-api2 message-handlers

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

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 个答案:

答案 0 :(得分:3)

我会在启动时向配置中注入一个MessageHandler,专门构建一个内部消息处理程序的动态列表,并将他们使用的接口从DelegatingHandler更改为自定义的接口,例如< / p>

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列表。