使用 URL c# 进行 Web-Api 版本控制
Web-Api versioning with URL c#
我现在已经苦苦挣扎了好几天,我正在努力实现我的 API 到带有 url 后缀的版本。
f.e。 http://localhost/api/v1/sites & http://localhost/api/v2/sites.
我想我已经很接近了,但突然我把一切都搞砸了..
非常感谢你帮助我。
现在我收到:“System.invalidOperationException:'映射到约束键 'apiVersion' 的约束类型 'ApiVersionRouteConstraint' 必须实现 IhttpRouteConstraint 接口。'在 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
}
}
确保您使用的是正确的 ApiVersionRouteConstraint
,因为 Microsoft.AspNetCore.Mvc.Routing
和 Microsoft.Web.Http.Routing
之间似乎存在冲突
如果您正在使用此版本控制库 Microsoft.AspNet.WebApi.Versioning 您应该使用 Microsoft.Web.Http.Routing
using Microsoft.Web.Http.Routing;
此外,您还可以向您的路线添加 apiVersion
约束,如下所示
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/v{apiVersion}/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new { apiVersion = new ApiVersionRouteConstraint() }
);
我认为你没有配置好 ASP.Net Web API 版本控制
http://www.intstrings.com/ramivemula/articles/asp-net-web-api-versioning/
您可以看看这个 post,您可能有一些 属性 没有正确配置,例如:
ReportApiVersions = true;
您可以使用 swagger 获得更好的 api 文档,也可以用于 api 版本控制。
已修复,最大的问题是控制器的不同版本位于不同的命名空间中。
这成功了:
namespace HIDDEN.Controllers.Sites
{
[Authorize]
[ApiVersion("1.0")]
[Route("v{version:apiVersion}/sites")]
public class valuesV1Controller : ApiController
{
// GET: api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
}
[Authorize]
[ApiVersion("2.0")]
[ApiVersion("2.1")]
[Route("v{version:apiVersion}/sites")]
public class valuesV2Controller : ApiController
{
// GET: api/values
public IEnumerable<string> Get()
{
return new string[] { "value3", "value4" };
}
}
}
我现在已经苦苦挣扎了好几天,我正在努力实现我的 API 到带有 url 后缀的版本。 f.e。 http://localhost/api/v1/sites & http://localhost/api/v2/sites.
我想我已经很接近了,但突然我把一切都搞砸了..
非常感谢你帮助我。
现在我收到:“System.invalidOperationException:'映射到约束键 'apiVersion' 的约束类型 'ApiVersionRouteConstraint' 必须实现 IhttpRouteConstraint 接口。'在 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
}
}
确保您使用的是正确的 ApiVersionRouteConstraint
,因为 Microsoft.AspNetCore.Mvc.Routing
和 Microsoft.Web.Http.Routing
如果您正在使用此版本控制库 Microsoft.AspNet.WebApi.Versioning 您应该使用 Microsoft.Web.Http.Routing
using Microsoft.Web.Http.Routing;
此外,您还可以向您的路线添加 apiVersion
约束,如下所示
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/v{apiVersion}/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new { apiVersion = new ApiVersionRouteConstraint() }
);
我认为你没有配置好 ASP.Net Web API 版本控制
http://www.intstrings.com/ramivemula/articles/asp-net-web-api-versioning/
您可以看看这个 post,您可能有一些 属性 没有正确配置,例如:
ReportApiVersions = true;
您可以使用 swagger 获得更好的 api 文档,也可以用于 api 版本控制。
已修复,最大的问题是控制器的不同版本位于不同的命名空间中。
这成功了:
namespace HIDDEN.Controllers.Sites
{
[Authorize]
[ApiVersion("1.0")]
[Route("v{version:apiVersion}/sites")]
public class valuesV1Controller : ApiController
{
// GET: api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
}
[Authorize]
[ApiVersion("2.0")]
[ApiVersion("2.1")]
[Route("v{version:apiVersion}/sites")]
public class valuesV2Controller : ApiController
{
// GET: api/values
public IEnumerable<string> Get()
{
return new string[] { "value3", "value4" };
}
}
}