Подтвердить что ты не робот

Пользовательский обработчик делегирования, специфичный для контроллера в веб-интерфейсе ASP.NET

Я написал специальный обработчик делегирования, который добавляет пользовательские заголовки в ответ и проверяет запрос.

Я добавил ручки в конфигурацию WebAPi

config.MessageHandlers.Add(new customHandler());

Но проблема относится ко всем контроллерам. Мне нужно применить настраиваемый заголовок для контроллеров. Можно ли добавлять пользовательские обработчики, специфичные для контроллера?

4b9b3361

Ответ 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