2016-05-17 5 views
0

実行時にメッセージハンドラを追加または削除するにはどうすればよいですか? 次の例では動作しません:実行時にMessageHandlerを削除/追加する

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

この方法では、youshould限り、あなたは保つよう、実行時にInnerHandlersのリストを変更することができる:

public interface ICustomMessageHandler 
{ 
    Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken); 
} 

この後、あなたは、内側のハンドラのリストが含まれている標準MessageHandlerを作成することができますDynamicMessageHandlerの単一インスタンス。

+0

それはスマートです、私はそれを試してみましょう:)メッセージハンドラが実行時に再設定できない理由についての任意のアイデア? –

+0

@MathiasColpaert 'GlobalConfiguration.Configure'メソッドが呼び出されると、設定が"ファイナライズ "されていると思われます。あなたはそのメソッドを再度呼び出してみることもできますが、それは一度の使用方法と思われます。 – Mig

+0

私はそれを試みました、Configureを再度呼び出すことはできません:) –

関連する問題