【发布时间】:2017-11-01 17:06:24
【问题描述】:
我们使用 Web API 2 构建多租户应用程序。我们希望将租户信息嵌入到 URL 中,以便每个请求都可以获取它。例如。 http://localhost/tenant1/api/test。 我们添加了一个操作过滤器,应该从请求中提取租户。但是,它仅在控制器操作方法签名具有相应参数时才有效。
代码如下:
public class ValidationFilter : ActionFilterAttribute
{
public override Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
{
// works only if controller action has that argument
var tenant = actionContext.ActionArguments["tenant"];
Console.Out.WriteLine("tenant = {0}", tenant);
return base.OnActionExecutingAsync(actionContext, cancellationToken);
}
}
当控制器是这样的时候效果很好:
[RoutePrefix("{tenant}")]
public class TestController : ApiController
{
[Route("api/test")]
public string Get(string tenant) // we don't need it here
{
return "hello";
}
}
tenant 将仅用于动作过滤器,因此将其添加到每个控制器方法似乎是一件愚蠢的事情。我们希望该控制器是:
public string Get() {...}
当控制器动作没有对应的参数时,有什么方法可以在动作过滤器中获取该值?
【问题讨论】:
标签: c# asp.net asp.net-web-api asp.net-web-api2