Как я могу ограничить обработчик делегирования определенным маршрутом в веб-API?

У меня есть пользовательский обработчик делегирования, который управляет аутентификацией запроса. В одном из моих контроллеров аутентификация не должна включаться для определенного действия. Как отключить обработчик делегирования для метода и маршрута POST api/MyController?

Один из вариантов заключается в том, чтобы жестко закодировать маршрут внутри обработчика, однако я предпочел бы сохранить эту логику из обработчика. Кроме того, я вижу, что я добавляю это поведение к еще нескольким действиям, которые могут затруднить этот метод.

protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
    if (request.Method == HttpMethod.Post
        && request.RequestUri.PathAndQuery.StartsWith("/api/MyController"))
        return base.SendAsync(request, cancellationToken);

    // Do authentication
}

Есть ли лучший способ, который легче поддерживать?

Ответ 1

При сопоставлении маршрутов происходит перегрузка MappHttpRoute, которая позволяет указать HttpMessageHandler. Вы можете добавить обработчик ко всем маршрутам, которые в нем нуждаются, и опустить его для маршрута, который не должен его использовать.
Для получения дополнительной информации см. Ссылку . Следующий образец берется из этого ресурса:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "Route1",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        config.Routes.MapHttpRoute(
            name: "Route2",
            routeTemplate: "api2/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional },
            constraints: null,
            handler: new MessageHandler2()  // per-route message handler
        );

        config.MessageHandlers.Add(new MessageHandler1());  // global message handler
    }
}