我已经努力了好几天,一直在尝试将我的API版本化,使用URL后缀。
例如:http://localhost/api/v1/sites 和 http://localhost/api/v2/sites。
我觉得我已经接近成功,但突然把所有东西都搞砸了。
非常感谢你的帮助。
现在我收到以下错误信息:"System.invalidOperationException:' The constraint type 'ApiVersionRouteConstraint' which is mapped to constraint key 'apiVersion' must implement the IhttpRouteConstraint interface.' on Global.asax.cs" Global.asax.cs
我觉得我已经接近成功,但突然把所有东西都搞砸了。
非常感谢你的帮助。
现在我收到以下错误信息:"System.invalidOperationException:' The constraint type 'ApiVersionRouteConstraint' which is mapped to constraint key 'apiVersion' must implement the IhttpRouteConstraint interface.' on Global.asax.cs" Global.asax.cs
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
namespace HIDDEN
{
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
}
WebApiConfig.cs
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.Owin.Security.OAuth;
using System.Web.Http;
using System.Web.Http.Routing;
namespace HIDDEN
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Configure Web API to use only bearer token authentication.
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
var contraintResolver = new DefaultInlineConstraintResolver()
{
ConstraintMap =
{
["apiVersion"] = typeof(ApiVersionRouteConstraint)
}
};
// Web API routes
config.MapHttpAttributeRoutes(contraintResolver);
config.AddApiVersioning(o =>
{
o.AssumeDefaultVersionWhenUnspecified = true;
//o.DefaultApiVersion = new ApiVersion(1, 0);
});
config.Routes.MapHttpRoute(
name: "DefaultApi",
//routeTemplate: "api/v{version:apiVersion}/{controller}/{id}",
routeTemplate: "api/v{version:apiVersion}/{controller}",
//routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// WebAPI when dealing with JSON & JavaScript!
// Setup json serialization to serialize classes to camel (std. Json format)
var formatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
formatter.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver();
// Adding JSON type web api formatting.
config.Formatters.Clear();
config.Formatters.Add(formatter);
}
}
}
RouteConfig.cs
using System.Web.Mvc;
using System.Web.Routing;
namespace HIDDEN
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
}
站点控制器
using FirebirdSql.Data.FirebirdClient;
using System;
using System.Web.Http;
using System.Configuration;
using System.Collections;
using Microsoft.Web.Http;
namespace HIDDEN.Controllers.V1
{
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[controller]")]
public class SitesController : ApiController
{
//code for V1
}
namespace HIDDEN.Controllers.V2
{
[ApiVersion("2.0")]
[Route("api/v{version:apiVersion}/[controller]")]
public class SitesController : ApiController
{
//code for V2
}
}
ApiVersion
,相比于您可以随时执行[Route("api/v2/[controller]")]
,这样做有什么优势?它是否在其他地方添加了其他功能? - Craig Hv2
将对 API 版本控制是未知的,因为它不允许、使用或解析“魔术字符串”。{version:apiVersion}
路由参数定义了名称 version,它使用了 ApiVersionRouteConstraint。这就是 API 版本控制知道从哪里提取值的方式。 - Chris MartinezapiVersion
路由约束的路由参数,则API版本控制将无法工作。这是API版本控制从模板中提取版本号的方式。没有它,v2
将成为一个常量字符串片段,并且API版本控制将认为未指定任何版本,因为它不知道如何从请求中_读取_它。 - Chris Martinez