在(每次)Web API操作之前执行代码

时间:2014-06-27 21:52:58

标签: wcf asp.net-web-api

我有一个Web API接口,我正在尝试适应多租户架构。以前,我们有一个WCF模式,我们将一个参数客户端ID传递给服务,然后将其存储在以后用于代码。这意味着客户端ID不必是传递给每个调用的第一个参数。

我想对Web API做同样的事情,即,而不是:

GetDocument(int clientId, int documentId)
GetDefault(int clientId)
GetImage(int clientId, int imageId)

刚刚:

GetDocument(int documentId)
GetDefault()
GetImage(int imageId)

但我需要一些方法来做到以下几点:

  1. 从路径
  2. 获取clientId
  3. 将此值放入我已经拥有的状态对象
  4. 所有呼叫实际执行之前。我有点认为路线会被重写 - 我很好,路由必须有客户端ID,而不是我的API。因此,对GetDefault的调用可能如下所示:

    /Document/GetDefault/1
    

    虽然API是:

    GetDefault()
    

    我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:16)

一种方法是自定义ActionFilter。请参阅here,虽然它与MVC有关,但概念与WebAPI相同:

  

ASP.NET MVC提供了用于执行过滤逻辑的Action Filters   在调用action方法之前或之后。动作过滤器是   自定义属性,提供声明性方法来添加预操作和   控制器动作方法的动作后行为。

例如:

    public class MyActionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
           //....
        }

        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
           //....
        }
    }

使用它来装饰你的API控制器/动作:

    [MyActionFilter]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }