Web API:当控制器操作没有相应的参数

时间:2017-11-01 17:06:25

标签: c# asp.net asp.net-web-api asp.net-web-api2

我们使用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() {...}

当控制器操作没有相应的参数时,有没有办法在动作过滤器中获取该值?

1 个答案:

答案 0 :(得分:1)

在发布问题后找到答案:)

  actionContext.ControllerContext.RouteData.Values["tenant"]

即使行动没有那个论点也能正常工作。