我们使用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() {...}
当控制器操作没有相应的参数时,有没有办法在动作过滤器中获取该值?
答案 0 :(得分:1)
在发布问题后找到答案:)
actionContext.ControllerContext.RouteData.Values["tenant"]
即使行动没有那个论点也能正常工作。