2012-12-17 8 views
11

Ho un problema con WebAPI un'eccezione qui nel mio codice:Il gestore interno non è stato assegnato utilizzando WebAPI Delega gestore

public class WebApiAuthenticationHandler : DelegatingHandler 
    { 
     private const string AuthToken = "AUTH-TOKEN"; 

     protected override Task<HttpResponseMessage> SendAsync(
      HttpRequestMessage request, CancellationToken cancellationToken) 
     {     
      var requestAuthTokenList = GetRequestAuthTokens(request); 
      if (ValidAuthorization(requestAuthTokenList)) 
      { 
       // EXCEPTION is occuring here!.... 
       return base.SendAsync(request, cancellationToken); 
      } 

      /* 
      ** This will make the whole API protected by the API token. 
      ** To only protect parts of the API then mark controllers/methods 
      ** with the Authorize attribute and always return this: 
      ** 
      ** return base.SendAsync(request, cancellationToken); 
      */ 
      return Task<HttpResponseMessage>.Factory.StartNew(
       () => 
       { 
        var resp = new HttpResponseMessage(HttpStatusCode.Unauthorized) 
        { 
         Content = new StringContent("Authorization failed") 
        }; 

        //var resp = new HttpResponseMessage(HttpStatusCode.Unauthorized);                     
        //resp.Headers.Add(SuppressFormsAuthenticationRedirectModule.SuppressFormsHeaderName,"true"); 
        return resp; 
       }); 
     } 

L'eccezione sta accadendo sulla linea:

base.SendAsync(request, cancellationToken); 

Non ho idea di come risolvere questo problema. Ho il seguente nella mia tabella di route:

routes.MapHttpRoute("NoAuthRequiredApi", "api/auth/", new { Controller = "Auth" }); 
    routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new { id = RouteParameter.Optional }, null, new WebApiAuthenticationHandler()); 

Il percorso questo accade su è il percorso DefaultApi. Qualsiasi aiuto molto apprezzato ....

risposta

29

Trovato la risposta here e un gestore di esempio here.

È necessario impostare InnerHandler su cui si desidera inoltrare la richiesta.

Basta aggiungere questo al tuo costruttore:

public class WebApiAuthenticationHandler : DelegatingHandler 
{ 
    public WebApiAuthenticationHandler(HttpConfiguration httpConfiguration) 
    { 
     InnerHandler = new HttpControllerDispatcher(httpConfiguration); 
    } 

e passare un riferimento a GlobalConfiguration quando si crea una nuova istanza:

routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new { id = RouteParameter.Optional }, null, WebApiAuthenticationHandler(GlobalConfiguration.Configuration)); 
2

A volte si dovrebbe verificare l'URL RESTful si richiede se davvero esiste nel tuo controller. Ho mai riscontrato questo tipo di eccezione che è stata causata dalla corrispondenza URL errata. Grazie.

Problemi correlati