如何在运行时添加或删除消息处理程序? 以下示例不起作用:
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);
}
将消息处理程序添加到列表中, 但是在下一次请求中没有调用它......
答案 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
列表。