我有一个 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)
但我需要某种方法来执行以下操作:
- 从路由中获取clientId
- 将此值放入我得到的状态对象中
所有这些都在调用实际执行之前进行。我有点认为路由会被重写 - 我同意路由中必须有客户端 ID,但不是我的 API。所以调用GetDefault
可能看起来像:
/Document/GetDefault/1
而 API 是:
GetDefault()
我怎样才能实现这个目标?
一种方法是自定义 ActionFilter。看here http://www.asp.net/mvc/tutorials/hands-on-labs/aspnet-mvc-4-custom-action-filters,虽然它是关于 MVC 的,但概念与 WebAPI 相同:
ASP.NET MVC 提供了 Action Filters 来执行过滤逻辑
在调用操作方法之前或之后。动作过滤器是
自定义属性提供声明性方式来添加预操作和
控制器操作方法的操作后行为。
例如:
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" };
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)