【问题标题】:How can I restrict a delegating handler to a specific route in Web API?如何将委派处理程序限制为 Web API 中的特定路由?
【发布时间】:2014-01-16 16:44:26
【问题描述】:

我有一个自定义委托处理程序来管理请求的身份验证。在我的一个控制器中,不应为特定操作启用身份验证。如何禁用 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
}

有没有更好更容易维护的方法?

【问题讨论】:

  • 并非如此。 MessageHandler 旨在将其行为一致地应用于所有请求。没有简单的解决方案应用全局动作过滤器然后有选择地删除它们。

标签: c# authentication asp.net-web-api


【解决方案1】:

映射路由时,MappHttpRoute 的重载允许您指定 HttpMessageHandler。您可以将处理程序添加到所有需要它的路由中,并为不应该使用它的路由省略它。
有关更多信息,请参阅此link。以下示例取自此资源:

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
    }
}

【讨论】:

  • 我可以通过路径和方法限制http路由吗,即POST for /api/MyController
  • @Omar:很好的链接。另一种方法是将 HttpPost 属性应用于操作方法。这也限制了它只接受 POST 请求,不管配置说什么。不确定我喜欢哪种方法。
  • 注意:我必须使用链接asp.net/web-api/overview/working-with-http/… 中的最后一个代码示例。你必须这样做,否则请求不会被路由到控制器。
  • 从 httpmethod 中分离路由有点像 IMO 的胡言乱语。您可以编写自己的实现 IDirectRouteFactory 和 IActionHttpMethodProvider 的属性......我还在路由中添加了一个“方法”约束,因为我仍然遇到 iactionhttpmethodprovider 实现不是......“足够”的情况。这是因为我有不同的控制器,它们具有相同的路由但不同的 HTTP 方法。
  • 将特定委托处理程序应用于属性路由的最佳方式是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 1970-01-01
  • 2014-12-07
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
相关资源
最近更新 更多