2016-05-17 96 views
0

如何在運行時添加或刪除消息處理程序? 下面的例子不工作:在運行時刪除/添加MessageHandlers

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

消息處理程序添加到列表中, 但它不會在接下來的請求被稱爲...

回答

2

我會注入到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左右。

+0

這很聰明,我會試試:)關於爲什麼消息處理程序無法在運行時重新配置的任何想法? –

+0

@MathiasColpaert我懷疑一旦GlobalConfiguration.Configure方法被調用,配置就會被「終結」。您可以嘗試再次調用該方法,但似乎這將是一次性使用方法。 – Mig

+0

我試過了,再次調用Configure不起作用:) –

相關問題