In un progetto API Web MVC 4 ASP.NET 4.5, desidero aggiungere un numero personalizzato HttpMessageHandler
. Ho cambiato WebApiConfig
classe (in \ App_Satrt \ WebApiConfig.cs), come segue:Come implementare HttpMessageHandler nell'API Web?
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: null,
handler: new MyCustomizedHttpMessageHandler()
);
}
}
Poi ho sviluppato MyCustomizedHttpMessageHandler
:
public class MyCustomizedHttpMessageHandler : HttpMessageHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
IPrincipal principal = new GenericPrincipal(
new GenericIdentity("myuser"), new string[] { "myrole" });
Thread.CurrentPrincipal = principal;
HttpContext.Current.User = principal;
return Task<HttpResponseMessage>.Factory.StartNew(() => request.CreateResponse());
}
}
Tuttavia, la richiesta alle API (diciamo http://mylocalhost.com/api/values) , restituisce sempre il codice di stato 200, senza dati. Voglio dire che non arriva mai al metodo 'GET()' di ValuesController.cs.
Cosa mi è mancato? Come posso implementare correttamente HttpMessageHandler
?
PS: Ho già letto questo: https://stackoverflow.com/a/12030785/538387, non mi aiuta.
Grazie. La soluzione (1) funziona bene. Ma il numero 2, 'new HttpControllerDispatcher()' dice: ** System.Web.HttpDispatcher.HttpControllerDispatcher non contiene un costruttore che accetta 0 argomenti ** - Aggiornamento: ho corretto il codice. Grazie. – Tohid
ho aggiornato anche il mio post sopra.grazie. –
Per favore aggiungi anche questa parte della risposta di Cuong Le alla tua risposta: ** Per scrivere un gestore di messaggi personalizzato, dovresti derivare da 'System.Net.Http.DelegatingHandler'. ** – Tohid