C# Asp.net Web API 2查询字符串参数版本控制中的API版本控制

C# Asp.net Web API 2查询字符串参数版本控制中的API版本控制,c#,api,asp.net-web-api,asp.net-core,asp.net-web-api2,C#,Api,Asp.net Web Api,Asp.net Core,Asp.net Web Api2,我想在我的Web API 2中实现查询字符串参数版本控制 已安装的nuget软件包:安装软件包Microsoft.AspNet.WebApi.Versioning WebApiConfig.cs config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/v{version}/default/{action}/{id}", d

我想在我的Web API 2中实现查询字符串参数版本控制

已安装的nuget软件包:安装软件包Microsoft.AspNet.WebApi.Versioning

WebApiConfig.cs

config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/v{version}/default/{action}/{id}",
                defaults: new { Controllers="Default", Version="1.0", id = RouteParameter.Optional }
            ); 
控制器

[ApiVersion("2.0")]
    [ApiVersion("1.0", Deprecated = true)]
    //[Route("api/v{version:apiVersion}/[controller]")]
    public class DefaultController : ApiController
    {
        public HttpResponseMessage Get()
        {
            return new HttpResponseMessage()
            {
                Content = new StringContent("GET: Default Test message")
            };
        } 

        //This action mapped to Version 2.0
        [HttpPost,MapToApiVersion("2.0")]
        public HttpResponseMessage GetProduct(Product item)
        {
            if (!ModelState.IsValid)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }

            return Request.CreateResponse(HttpStatusCode.OK, item.Name);
            // Implementation not shown...
        }
    } 
我想使用URI:API/v2.0/default/GetProduct访问API


但是,没有找到与请求URI匹配的HTTP资源。您的问题表明您希望按查询字符串进行版本设置,但代码和示例表明您希望按URL段进行版本设置。你可能想澄清你的问题。我假设你指的是URL段

这不起作用的原因是您没有应用apVersionRouteConstraint。根据定义,
{version}
路由参数被视为一个普通的旧字符串,这将不起作用

正确的设置是:

config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“api/v{version}/{controller}/{action}/{id}”,
默认值:new{controller=“Default”,id=RouteParameter.Optional},
约束条件:new{version=new ApiVersionRouteConstraint()},
); 

除非位于模板末尾,否则不能有默认值。这意味着
{Version=“1.0”}
将无效,可以省略。名称
version
可以是您想要的任何名称,只要它与模板中指定的名称匹配。

您的问题表示您希望按查询字符串进行版本设置,但代码和示例表明您希望按URL段进行版本设置。你可能想澄清你的问题。我假设你指的是URL段

这不起作用的原因是您没有应用apVersionRouteConstraint。根据定义,
{version}
路由参数被视为一个普通的旧字符串,这将不起作用

正确的设置是:

config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“api/v{version}/{controller}/{action}/{id}”,
默认值:new{controller=“Default”,id=RouteParameter.Optional},
约束条件:new{version=new ApiVersionRouteConstraint()},
); 

除非位于模板末尾,否则不能有默认值。这意味着
{Version=“1.0”}
将无效,可以省略。名称
version
可以是您想要的任何名称,只要它与模板中指定的名称匹配。

为什么
GetProduct
操作是一个
[HttpPost]
请求?GetProduct是操作名称,需要使用的方法类型是[HttpPost],因此,GetProduct只是命名(可以是任何名称)。为什么
GetProduct
操作是一个
[HttpPost]
请求?GetProduct是操作名称,需要使用的方法类型是[HttpPost],因此,GetProduct只是命名而已(它可以是任何东西)。