Asp.net core mvc 具有自定义约束的Mvc6版本化api操作

Asp.net core mvc 具有自定义约束的Mvc6版本化api操作,asp.net-core-mvc,Asp.net Core Mvc,我正在用mvc6制作一个版本化的api,为此,我希望能够为操作指定它应该在哪个api版本上工作 我的api路由是:/api/{version}/..,因此我希望在某个操作中检查版本路由值,并查看此操作是否适用于该版本 我希望能够将其指定为api操作的属性,例如: // This is the base api controller [Route("api/{version:regex(^v[[0-9]].[[0-9]]$)}/[controller]")] public abstract cla

我正在用mvc6制作一个版本化的api,为此,我希望能够为操作指定它应该在哪个api版本上工作

我的api路由是:
/api/{version}/..
,因此我希望在某个操作中检查
版本
路由值,并查看此操作是否适用于该版本

我希望能够将其指定为api操作的属性,例如:

// This is the base api controller
[Route("api/{version:regex(^v[[0-9]].[[0-9]]$)}/[controller]")]
public abstract class ApiControllerBase { ... }

// This is an action in one of the sub classes
[HttpGet("foo")]
[ApiVersion("0.1", "0.2")] // Here! (this is params string[])
public object Foo()
{
    // return
}

// This is an action in another sub class
[HttpGet("foo")]
[ApiVersion("1.0")]
public object Foo()
{
    // return
}
我的问题是,
ApiVersion
应该实现或扩展什么才能使其工作?我不相信动作过滤器能像我所希望的那样工作,因为我不想在不匹配时返回404,因为其他控制器中的其他动作可能能够处理这个问题(稍后我可能会使用带有普通动作的
HomeController
,以及带有仅适用于
1.0
的扩展动作的
Home2Controller


注意我不是要求实现
ApiVersionAttribute
,我只需要知道我应该连接到哪个mvc基础架构(操作过滤器、路由约束等)这将允许我创建一个属性,它可以查看路由值并判断此操作是否匹配。

分析mvc6源代码花了4个小时,但这是值得的。我使用实现Microsoft.AspNet.Mvc.ActionConstraints.IActionConstraint的动作属性解决了这个问题

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class ApiVersionAttribute : Attribute, IActionConstraint
{
    public ApiVersionAttribute(string version)
    {
        Version = version;
    }

    public string Version { get; }

    public int Order => 0;

    public bool Accept(ActionConstraintContext context)
    {
        var routeData = context.RouteContext.RouteData;
        // return ...
    }
}
然后在某个动作上:

[HttpGet("foo")]
[ApiVersion("0.1")]
public object Foo()
{
    // return ...
}

为什么不使用单独的控制器,也许使用继承?对我来说,拥有处理动作的属性似乎很复杂。如果一个动作改变了怎么办?我真的只是想在匹配哪些动作适用于哪些版本时有很大的灵活性。如果能达到我所希望的灵活性,我愿意采用其他方法。现在正在研究其中一些。