Как реализовать HttpMessageHandler в веб-API?
в ASP.NET 4.5 MVC 4 Web API project, Я хочу добавить пользовательский HttpMessageHandler
. Я изменился WebApiConfig
класс (в App_SatrtWebApiConfig.cs), следующим образом:
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()
);
}
}
затем я развился 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());
}
}
однако запрос к API (скажем http://mylocalhost.com/api/values), всегда возвращает код состояния 200, без каких-либо данных. Я имею в виду, что он никогда не попадает в ValuesController.метод "GET ()" cs.
что я пропустила? Как я могу реализовать HttpMessageHandler
правильно?
PS: уже прочитал это:https://stackoverflow.com/a/12030785/538387, не помогает мне.
2 ответов
здесь вы создаете HttpMessageHandler
какие короткие замыкания запроса и не позволяют запросу пройти через остальную часть трубопровода. Вместо этого, вы должны создать DelegatingHandler
.
также есть 2 вида конвейеров обработчика сообщений в Web API. Один-это обычный конвейер, по которому проходят все запросы на все маршруты, а другой-обработчики сообщений, специфичные только для определенных маршрутов.
-
попробуйте создать
DelegatingHandler
и добавить его в вашHttpConfiguration
список обработчиков сообщений:config.MessageHandlers.Add(new HandlerA())
-
если вы хотите добавить обработчик сообщений определенного маршрута, то вы можете сделать следующее:
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()}) );
Этот Плакат Веб-Api показывает поток газопровод.
чтобы написать пользовательский обработчик сообщений, вы должны получить из 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);
}
}
и звонок base.SendAsync
для отправки запроса во внутренний обработчик.