【问题标题】:Web API 2 versioning with Microsoft.AspNet.WebApi.Versioning使用 Microsoft.AspNet.WebApi.Versioning 的 Web API 2 版本控制
【发布时间】:2019-10-29 18:26:42
【问题描述】:

我正在使用ASP.NET Versioning Library,我已按照步骤将此库添加到一个非常基本的 ASP.NET Web API 2 项目中,以下是我的文件内容: Global.asax文件:

 public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        }
    }

Web API 配置:

  public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.MapHttpAttributeRoutes();
            config.AddApiVersioning(c => c.AssumeDefaultVersionWhenUnspecified = true);   
        }
    }

第一个控制器:

namespace WebApplication5.Controllers
{
    [ApiVersion("1.0")]
    [RoutePrefix("api1")]
    public class ValuesController : ApiController
    {
        [Route("values")]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
        [Route("values/{id}")]
        public string Get(int id)
        {
            return "value";
        }
    }
}

第二控制器:

namespace WebApplication5.Controllers
{
    [ApiVersion("2.0")]
    [RoutePrefix("api1")]
    [ControllerName("Values")]
    public class ValuesController2 : ApiController
    {
        [Route("values")]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
        [Route("values/{id}")]

        // GET api/values/5
        public string Get(int id)
        {
            return "value";
        }
    }
}

当我运行应用程序并导航到这个 url:http://localhost:5428/api1/values?api-version=1.0 时,我得到了想要的结果,但是当我导航到这个 url:http://localhost:5428/api1/values?api-version=2.0 时,我遇到一条错误消息,指出 No route providing a controller name with API version '2.0' was found to match request URI 'http://localhost:5428/api1/values',我想知道是什么我错过了这个基本设置?

如果我从 ValuesController2 中删除 [ControllerName] 属性,则没有任何变化并且问题仍然存在。

我尝试更改第二个控制器的命名空间,但也没有解决问题!

我正在使用这个库的3.0.1 版本。

【问题讨论】:

  • 您的问题帮助我了解了如何实现版本控制。我正在寻找示例。

标签: c# asp.net api-versioning aspnet-api-versioning


【解决方案1】:

刚刚意识到您的问题是,控制器名称应该是Values2Controller 而不是ValuesController2

控制器位于名称上使用 be 约定,它删除了控制器部分,但你的是 Controller2,所以我猜它没有根据你收到的消息找到它。

【讨论】:

  • 哇!它确实有效,这是我错过的一个非常微妙的点。
  • 我不想从 Andrew HB 那里拿走任何东西,但我确实想进一步详细说明为什么会发生这种情况。这不是由于 API 版本控制,而是由于 ASP.NET Web API 的工作方式。如果您检查DefaultHttpControllerTypeResolver.IsControllerType 方法,您会看到有效的控制器类型必须Controller 结尾,而您的控制器没有。我记得,它的历史是忽略非抽象超类型,例如XXXControllerBase
【解决方案2】:

不确定控制器上具有 ApiVersion 属性的有效性,但在我的实现中,我的操作中具有该属性,例如

    [AllowAnonymous]
    [Route("[controller]")]
    [ApiController]
    public class VersionDemoController
    {
        [ApiVersion("1.1")]
        [HttpGet("requestStuff")]
        public string RequestStuff()
        {
            return "Stuff using Version 1.1 API";
        }
    }

更新: 刚刚尝试使用控制器上的属性,它似乎工作正常,我的命名空间不同,动作名称相同。我使用的是版本控制包的 3.1.2 版本。

【讨论】:

  • 我猜你正在使用这个库的 .net 核心版本!我正在使用旧的 .Net Web API 2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多