2012-10-20 17 views

Antwort

15

Nein, weil die Meldungshandler auf roher HttpRequestMessage oder roher HttpResponseMessage (im Falle von Fortsetzungen) arbeiten. Also wirklich, es gibt kein Konzept von "Stromregler ausgeführt" mit DelegatingHandlers seit Nachrichtenhandler aufgerufen werden, bevor die Anfrage an die Steuerung oder (wieder im Falle von Fortsetzungen) nach dem Controller die Antwort zurückgibt.

Allerdings hängt es wirklich davon ab, was Sie versuchen zu tun.

Wenn Sie wissen möchten, auf welchen Controller die Anfrage weitergeleitet wird, können Sie den Mechanismus, der die Controller intern auswählen würde, manuell aufrufen.

public class MyHandler : DelegatingHandler 
{ 
    protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) 
    { 
     var config = GlobalConfiguration.Configuration; 
     var controllerSelector = new DefaultHttpControllerSelector(config); 

     // descriptor here will contain information about the controller to which the request will be routed. If it's null (i.e. controller not found), it will throw an exception 
     var descriptor = controllerSelector.SelectController(request); 

     // continue 
     return base.SendAsync(request, cancellationToken); 
    } 
} 
+0

Danke, ich habe eine Validierungsroutine, und es wäre nett, in der Lage zu sein, den Controller-Typ zu überprüfen, ob es ein benutzerdefiniertes Attribut definiert hat, so kann ich diese Validierungsroutine vermeiden. Dies sollte dies ermöglichen. –

+0

großartig. Ja, Sie können das leicht tun, sobald Sie eine Instanz von HttpControllerDescriptor –

+0

@FilipW greifen, gibt es eine "nette" Möglichkeit, dies zu tun, ohne dass es eine Ausnahme auslöst? Im Quelltext ruft der Aufruf von 'SelectController' schließlich 'this._controllerInfoCache.Value.TryGetValue (controllerName, out controllerDescriptor)' auf, aber' _controllerInfoCache' ist in keiner Weise öffentlich zugänglich – wal

0

die @GalacticBoy Lösung erweitern, wäre es besser,

public class MyHandler : DelegatingHandler 
{ 
    private static IHttpControllerSelector _controllerSelector = null; 

    protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) 
    { 
     if (_controllerSelector == null) 
     { 
      var config = request.GetConfiguration(); 
      _controllerSelector = config.Services.GetService(typeof(IHttpControllerSelector)) as IHttpControllerSelector; 
     } 

     try 
     { 
      // descriptor here will contain information about the controller to which the request will be routed. If it's null (i.e. controller not found), it will throw an exception 
      var descriptor = _controllerSelector.SelectController(request); 


     } 
     catch 
     { 
      // controller not found 
     } 

     // continue 
     return base.SendAsync(request, cancellationToken); 
    } 
} 
0

auf der Verwendung Je was die Informationen, nachdem die Anforderung ausgeführt mit immer wird Sie mit den Informationen, vielleicht Ihren feinen tun. Zum Beispiel Protokollierung des ausgeführten Controllers/Aktion.

using System; 
using System.Net.Http; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Web; 

namespace Example 
{ 
    public class SampleHandler : DelegatingHandler 
    { 
     protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
     { 
      return base.SendAsync(request, cancellationToken) 
         .ContinueWith(task => 
         { 
          HttpResponseMessage response = task.Result; 

          string actionName = request.GetActionDescriptor().ActionName; 
          string controllerName = request.GetActionDescriptor().ControllerDescriptor.ControllerName; 

          // log action/controller or do something else 

          return response; 
         }, cancellationToken); 
     } 
    } 
} 
Verwandte Themen