Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将委托处理程序限制为Web API中的特定路由?_C#_Authentication_Asp.net Web Api - Fatal编程技术网

C# 如何将委托处理程序限制为Web API中的特定路由?

C# 如何将委托处理程序限制为Web API中的特定路由?,c#,authentication,asp.net-web-api,C#,Authentication,Asp.net Web Api,我有一个自定义的委托处理程序,用于管理请求的身份验证。在我的一个控制器中,不应为特定操作启用身份验证。如何禁用方法和路由的委派处理程序POST-api/MyController 一种选择是在处理程序内部硬编码路由,但是,我宁愿将此逻辑保留在处理程序之外。此外,我还看到自己将此行为添加到其他一些操作中,这会使此方法难以维护 protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(Http

我有一个自定义的委托处理程序,用于管理请求的身份验证。在我的一个控制器中,不应为特定操作启用身份验证。如何禁用方法和路由的委派处理程序
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
}
受保护的覆盖System.Threading.Tasks.Task SendAsync(HttpRequestMessage请求,System.Threading.CancellationToken CancellationToken)
{
if(request.Method==HttpMethod.Post
&&request.RequestUri.PathAndQuery.StartsWith(“/api/MyController”))
返回base.sendaync(请求、取消令牌);
//进行身份验证
}

是否有更好的方法更易于维护?

在映射路由时,存在允许您指定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
    }
}

不是真的。MessageHandler旨在将其行为一致地应用于所有请求。应用全局操作筛选器然后有选择地删除它们并不是一个简单的解决方案。我是否可以按路径和方法限制http路由,即
/api/MyController
POST
?@Omar:good link。另一种方法是将HttpPost属性应用于action方法。这也限制了它只接受POST请求,不管配置如何。不确定我喜欢哪种方法。注意:我必须使用链接中的最后一个代码示例。您必须这样做,否则请求将不会路由到控制器。路由与httpmethod的分离在我看来有点废话。您可以编写自己的属性来实现IDirectRouteFactory和IActionHttpMethodProvider。。。我还向路由添加了一个“方法”约束,因为我仍然遇到iactionhttpmethodprovider实现不可用的情况。。。“够了”。这是因为我有不同的控制器,它们有相同的路由,但有不同的HTTP方法?