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
的实例。
如何在运行时添加或删除消息处理程序? 以下示例不起作用:
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
的实例。