【问题标题】:Web API: How to get a route parameter when controller action does not have corresponding argumentWeb API:当控制器动作没有相应参数时如何获取路由参数
【发布时间】: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


    【解决方案1】:

    发布问题后找到答案:)

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

    即使动作没有该参数也可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-09
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      • 2018-08-21
      • 1970-01-01
      • 2020-02-08
      相关资源
      最近更新 更多