Пользовательский обработчик делегирования, специфичный для контроллера в веб-интерфейсе ASP.NET
Я написал специальный обработчик делегирования, который добавляет пользовательские заголовки в ответ и проверяет запрос.
Я добавил ручки в конфигурацию WebAPi
config.MessageHandlers.Add(new customHandler());
Но проблема относится ко всем контроллерам. Мне нужно применить настраиваемый заголовок для контроллеров. Можно ли добавлять пользовательские обработчики, специфичные для контроллера?
Ответы
Ответ 1
В конце этой статьи объясняется, как применять обработчики только к определенным маршрутам: http://www.asp.net/web-api/overview/working-with-http/http-message-handlers. Возможно, вам придется создать уникальный обработчик для вашего контроллера, чтобы он мог применяться только к этому контроллеру.
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());
);
Относительно того, как будет выглядеть конвейер обработчиков сообщений на маршруте, вы можете посмотреть здесь. p >
Ответ 2
Что вы можете сделать, это использовать обработчик сообщений на маршруте, но будьте осторожны. Как статья, связанная с @Nick в его ответе, вы можете связать обработчик и убедиться, что задействован HttpControllerDispatcher
. В противном случае вы не попадете в конвейер контроллера.
Еще один вариант, который мне нравится, - использовать HttpControllerDispatcher
в качестве базового класса для вашего пользовательского обработчика:
public class CustomerOrdersDispatcher : HttpControllerDispatcher {
public CustomerOrdersDispatcher(HttpConfiguration config)
: base(config) {
}
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken) {
// Do some stuff here...
return base.SendAsync(request, cancellationToken);
}
}
Здесь, как вы зарегистрируете его:
protected void Application_Start(object sender, EventArgs e) {
var config = GlobalConfiguration.Configuration;
config.Routes.MapHttpRoute(
name: "CustomerOrdersHttpRoute",
routeTemplate: "api/customers/{customerKey}/orders/{key}",
defaults: new { controller = "CustomerOrders", key = RouteParameter.Optional },
constraints: null,
handler: new CustomerOrdersDispatcher(config)
);
config.MessageHandlers.Add(new SomeOtherHandler1());
config.MessageHandlers.Add(new SomeOtherHandler2());
}
После выполнения SomeOtherHandler1
и SomeOtherHandler2
ваш CustomerOrdersDispatcher
будет выполнен для маршрута CustomerOrdersHttpRoute. Таким образом, вы можете видеть, что вы сохраняете поведение обработчика по умолчанию и устанавливаете некоторые глобальные обработчики, в то время как у вас есть определенный маршрут.
Вот полная реализация моего CustomerOrdersDispatcher
: https://github.com/tugberkugurlu/AdvancedWebAPI/blob/master/PerRouteMHOwnershipSample/Dispatcher/CustomerOrdersDispatcher.cs.
Вы можете просмотреть полный образец исходного кода приложения, а также посмотреть, как он работает: https://github.com/tugberkugurlu/AdvancedWebAPI/tree/master/PerRouteMHOwnershipSample