Как добавить MessageHandler для определенного контроллера, который использует атрибуты маршрутизации в ASP.NET WebAPI 2?
Можно добавить MessageHandler только для конкретного контроллера, который использует атрибуты маршрута?
Я хочу сократить запрос ранее в конвейере, если он не содержит определенных заголовков. Я хочу упомянуть, что:
Я не могу добавить другой маршрут в WebApiConfig, мы должны использовать атрибуты маршрутизации от контроллера.
Я не хочу добавлять MessageHandler глобально.
Это должен быть MessageHandler (в начале разработки). У нас есть альтернативы для этого, но мы пытаемся сделать это более эффективным.
Например, я украсил контроллер следующим RoutePrefix: api/myapicontroller и одним действием с Route(""). (Я знаю, что это странно, мы выбираем другое действие на основе строки запроса)
Затем я добавил
config.Routes.MapHttpRoute(
name: "CustomRoute",
routeTemplate: "api/myapicontroller/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: null,
handler: new myMessageHandler()
);
Если я поставлю этот код раньше config.MapHttpAttributeRoutes();
myMessageHandler выполняется, но я получаю это сообщение:
На контроллере myapicontroller, соответствующем запросу, не найдено никаких действий
Если я поставлю config.MapHttpAttributeRoutes();
во-первых, myMessageHandler никогда не выполняется, но вызывается my action внутри myapicontroller.
2 ответа
К сожалению, вы не можете установить какие-либо обработчики через AttributeRouting
, Если вы хотите назначить обработчик для определенных маршрутов, вы должны зарегистрировать его через MapHttpRoute
только. За исключением того, что вам нужно добавить имя вашего контроллера в defaults
раздел, как в ответ Ajay Aradhya и удалить Route
атрибут из вашего действия, потому что вы можете регистрировать маршруты либо с Route
атрибут или MapHttpRoute
метод, но не оба одновременно.
Также обратите внимание, что вам нужно создать конвейер, в противном случае ваш обработчик будет работать, но запрос не сработает в действии контроллера. Смотрите мой ответ на аналогичный вопрос для деталей.
Эта статья из MS docs объясняет то же самое. Наконец, они предоставляют способ иметь специфичные для контроллера обработчики. Но это для обычной маршрутизации. Я не знаю, помогает ли это вам или нет.
config.Routes.MapHttpRoute(
name: "MyCustomHandlerRoute",
routeTemplate: "api/MyController/{id}",
defaults: new { controller = "MyController", id = RouteParameter.Optional },
constraints: null,
handler: HttpClientFactory.CreatePipeline(new HttpControllerDispatcher(config), new MyCustomDelegatingMessageHandlerA());
);