gpt4 book ai didi

c# - Web Api 2 API 无法识别路由的多个属性(版本控制)

转载 作者:可可西里 更新时间:2023-11-01 09:05:11 24 4
gpt4 key购买 nike

我正在尝试同时实现 Attribute Routing和来自 RoutingConstaints SampleVersionedRoute但是当我在 Controller 上同时使用两者时,versioned 属性不再有效。

我需要对属性进行哪些修改才能使其与属性路由配合使用?

对于代码示例,请下载示例项目(或者只查看上面链接中的几个文件),然后这样修改路由:

// When I use the RoutePrefix, VersionedRoute no longer works (Sending "Api-Version" through http header doesn't route correctly
// If I remove the RoutePrefix I can use VersionedRoute again
// What do I need to change in its code to be able to use both?

[VersionedRoute("api/Customers", 1)] // This route would be used as http://url/api/customers with a header of "api-version: 1"
[RoutePrefix("api/v1/Customers")] // This route would be used purely through url versioning of http://url/api/v1/Customers
public class CustomersV1Controller : ApiController {

/* Other stuff removed */

[VersionedRoute("api/Customer", 1)] // I'd rather not have to use this here at all and just use a single one on the class, but having both nor just one on either works right now.
[Route("")]
public IHttpActionResult Get()
{
return Json(_customers);
}
}

VersionedRoute Code

VersionConstraint Code

编辑:如果您需要更多信息,甚至发布想法或要尝试的事情,请告诉我:)

Edit2:这是我尝试从 Troy Hunt 的博客中尝试做的事情的示例:http://www.troyhunt.com/2014/02/your-api-versioning-is-wrong-which-is.html

Edit3:这是我希望编码尽可能接近的内容,因为它会减少大量开销和魔法字符串。

[VersionedRoute("api/Customers", 1)] // This route would be used as http://url/api/customers with a header of "api-version: 1"
[RoutePrefix("api/v1/Customers")] // This route would be used purely through url versioning of http://url/api/v1/Customers
public class CustomersV1Controller : ApiController {

/* Other stuff removed */
[Route("")]
public IHttpActionResult Get()
{
// Removed
return Ok(customers);
}


[Route("{id:int}")]
public IHttpActionResult GetById(int id)
{
// Removed
return Ok(customer);
}
}

[VersionedRoute("api/Customers", 2)] // This route would be used as http://url/api/customers with a header of "api-version: 2"
[RoutePrefix("api/v2/Customers")] // This route would be used purely through url versioning of http://url/api/v2/Customers
public class CustomersV2Controller : ApiController {

/* Other stuff removed */
[Route("")]
public IHttpActionResult Get()
{
// Removed
return Ok(customersThatAreDifferentThanV1);
}


[Route("{id:int}")]
public IHttpActionResult GetById(int id)
{
// Removed
return Ok(customerThatIsDifferent);
}
}

编辑:最后一点,尝试只在 Controller 属性级别而不是每个操作为每个路由写入一次路由版本信息。

最佳答案

RouteVersionedRoute 属性可以很好地协同工作,但是您的 RoutePrefix 属性也应用于您的 VersionedRoute(尝试访问/api/v1/Customers/api/Customer - 当设置了 api-version header 时,您将收到响应)

对于返回正确响应的示例中的两个 URL,以下代码将产生所需的行为,但显然这不能解决您想要一个 VersionedRoute 和一个 RoutePrefix 的问题 在类的顶部。为此需要另一种方法。但是,您可以为不同的 API 版本设置单独的 Controller 。

[RoutePrefix("api")]
public class CustomersV1Controller : ApiController
{
/* Other stuff removed */

[VersionedRoute("Customers", 1)]
[Route("v1/Customers")]
public IHttpActionResult Get()
{
return Json(_customers);
}
}

一个改进是创建您自己的属性而不是 Route,这样您就不需要每次都为版本添加前缀:

public class CustomVersionedRoute : Attribute, IHttpRouteInfoProvider
{
private readonly string _template;

public CustomVersionedRoute(string route, int version)
{
_template = string.Format("v{0}/{1}", version, route);
}

public string Name { get { return _template; } }
public string Template { get { return _template ; } }
public int Order { get; set; }
}

[RoutePrefix("api")]
public class CustomersV2Controller : ApiController
{
/* Other stuff removed */

[VersionedRoute("Customers", 2)]
[CustomVersionedRoute("Customers", 2)]
public IHttpActionResult Get()
{
return Json(_customers);
}
}

关于c# - Web Api 2 API 无法识别路由的多个属性(版本控制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26307695/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com