ASP.NET Web API - 在路由方法之前为所有请求调用的方法?

fdm*_*ion 1 asp.net asp.net-web-api

我正在用 C# 编写 ASP.NET Web API 2。我想要的是一个包罗万象的方法,它将针对传入我的 Web API 的每个请求执行。

如果该方法返回 null,则应继续原来的路由,寻找正确的方法。但是,如果该方法返回 HTTPResponseMessage,则服务器应返回该响应,而不继续进行正常路由。

用例是处理可能影响整个 API 的各种场景的能力。例如:禁止单个 IP 地址、阻止(或白名单)某些用户代理、处理 API 调用计数(例如,某人只能向任何人发出 X 请求)API 方法发出 X 个请求)。

我现在能想到的唯一方法就是在我为 API 编写的每个新方法中逐字包含一个方法调用。例如,

[HttpGet]
public HttpResponseMessage myNewMethod()
{
    // I want to avoid having to do this in every single method.
    var check = methodThatEitherReturnsResponseOrNull(Request);
    if (check != null) return (HttpResponseMessage)check;

    // The method returned null so we go ahead with normal processing.
    ...
}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以在路由中实现这一点吗?

Igo*_*gor 5

这就是操作过滤器的用途。这些属性可以全局放置在类(控制器)或方法(操作)级别。这些属性可以进行预处理(在操作执行之前执行一些代码)或后处理(在操作执行之后执行代码)。

使用预处理时,您可以选择将结果返回给调用者,并且根本不触发您的方法(操作)。这对于模型验证、授权检查等很有用。

要全局注册过滤器,请编辑该WebApiConfig.cs文件。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Filters.Add(new YourFilterAttribute()); // add record
        // rest of code
    }
}
Run Code Online (Sandbox Code Playgroud)

要创建自定义属性,System.Web.Http.Filters.ActionFilterAttribute您可以继承或实现接口System.Web.Http.Filters.IActionFilter,也可以实现IAuthorizationFilter/AuthorizationFilterAttribute,或者如果您特别想要允许/拒绝请求,则

听起来您还想创建多个属性,每个属性对应一个角色,例如 IP 过滤或计数调用等。这样,它将更加模块化,而不是一个庞大的授权过滤器。

有很多像这样的教程(在我的谷歌搜索结果中随机选择)。我不会发布代码,因为你也没有这样做,所以我只是猜测你想做什么。