1

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

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

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

4

1 回答 1

4

我会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周围的实例,您就应该能够在运行时修改列表。

于 2016-05-18T14:41:33.043 回答