【问题标题】:Web API versioning configurationWeb API 版本控制配置
【发布时间】:2014-07-08 05:25:04
【问题描述】:

我是 Mvc 的新手并尝试编写 restful api,我使用 web api 类型的应用程序,并尝试创建版本控制,最后我希望有像 api/v1/values/get、api/v2/ 这样的链接类型值/得到。我试图在控制器文件夹中创建文件夹 v1 和 v2,并在那里创建名称为 ValuesController 的控制器,但我的请求不起作用。我得到了 HTTP 404.0 - 未找到。我如何配置路由或做一些事情来解决这个问题?

【问题讨论】:

    标签: asp.net-mvc rest asp.net-web-api


    【解决方案1】:

    您可以使用attribute routing 来实现这种版本控制。对于您的示例,它看起来类似于下面的代码 sn-p

    [RoutePrefix("api/v1/values")]
    public class ValuesController : ApiController
    {
      public object Get(int id) { ... }
    }
    
    [RoutePrefix("api/v2/values")]
    public class NewValuesController : ApiController
    {
      public object Get(int id) { ... }
    }
    

    编辑

    如果您有现有项目,请不要忘记启用属性路由。您的 WebApiConfig 应包含以下 sn-p:

    public static class WebApiConfig
    {
      public static void Register(HttpConfiguration config)
      {
        // Attribute routing.
        config.MapHttpAttributeRoutes();
    
        // Convention-based routing.
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
      }
    }
    

    如果您不想使用基于约定的配置,可以删除 MapHttpRoute 部分。

    您还应该确保您的 Global.asax 包含以下内容:

    protected void Application_Start()
    {
      // Pass a delegate to the Configure method.
      GlobalConfiguration.Configure(WebApiConfig.Register);
    }
    

    【讨论】:

    • 谢谢:) 但是我有错误,找不到与名为“v1”的控制器匹配的类型。
    【解决方案2】:

    通过命名空间进行 API 版本控制在 here 中进行了解释。按照博文和given example 中的说明为自己创建一个新的 HttpControllerSelector,然后通过以下方式在FilterConfig 中切换到该选择器:

    GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerSelector), new NamespaceHttpControllerSelector(GlobalConfiguration.Configuration));
    

    然后,注册您的路线:

    config.Routes.MapHttpRoute(
      name: "VersionedApi",
      routeTemplate: "api/{version}/{controller}/{id}",
      defaults: new { id = RouteParameter.Optional }
    );
    
    config.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "api/{controller}/{id}",
      defaults: new { id = RouteParameter.Optional }
    );
    

    在您的自定义 HttpControllerSelector 中,如果您想回退到默认版本,请使用以下内容:

    string versionName = GetRouteVariable<string>(routeData, "version");
    versionName = versionName ?? DefaultVersion;
    

    【讨论】:

      猜你喜欢
      • 2020-01-08
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 2017-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多