formdata form example data consumir c# asp.net-mvc-4 asp.net-web-api asp.net-4.5

c# - form - ¿Cómo implementar HttpMessageHandler en la API web?



send form data to web api c# (2)

Aquí está creando un HttpMessageHandler que cortocircuita la solicitud y no permite que la solicitud pase por el resto de la canalización. En su lugar, debe crear un DelegatingHandler .

También hay 2 tipos de tuberías de manejador de mensajes en la API web. Una es una canalización regular en la que pasan todas las solicitudes de todas las rutas y otra donde se podrían tener manejadores de mensajes específicos para ciertas rutas únicamente.

  1. Intente crear un DelegatingHandler y agréguelo a la lista de manejadores de mensajes de HttpConfiguration:

    config.MessageHandlers.Add(new HandlerA())

  2. Si desea agregar un controlador de mensajes específico para la ruta, puede hacer lo siguiente:

    config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }, constraints: null, handler: HttpClientFactory.CreatePipeline( new HttpControllerDispatcher(config), new DelegatingHandler[]{new HandlerA()}) );

Este Web Api Poster muestra el flujo de la tubería.

En un proyecto de API web de ASP.NET 4.5 MVC 4, quiero agregar un HttpMessageHandler personalizado. He cambiado la clase WebApiConfig (en / App_Satrt / WebApiConfig.cs), de la siguiente manera:

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

Luego desarrollé 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()); } }

Sin embargo, la solicitud a la API (digamos http://mylocalhost.com/api/values ), siempre devuelve el código de estado 200, sin ningún dato. Quiero decir que nunca llega al método ''GET ()'' de ValuesController.cs.

¿Qué me he perdido? ¿Cómo puedo implementar HttpMessageHandler correctamente?

PD: Ya he leído este: https://stackoverflow.com/a/12030785/538387 , no me ayuda.


Para escribir un controlador de mensajes personalizado, debe derivar de System.Net.Http.DelegatingHandler

class CustomMessageHandler : DelegatingHandler { 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 base.SendAsync(request, cancellationToken); } }

Y llame a base.SendAsync para enviar la solicitud al controlador interno.