如何使用更高版本的web api控制器

时间:2018-03-21 20:55:10

标签: asp.net-web-api asp.net-web-api2 asp.net-web-api-routing api-versioning

我在下面说: https://www.hanselman.com/blog/ASPNETCoreRESTfulWebAPIVersioningMadeEasy.aspx

是否可以为web api控制器提供更高版本。 像:

  mutate(bully_past = as.numeric(had_previous_event(cbully)))

使用上述内容时,只有在使用网址ApiVersion("2.05")] [RoutePrefix("api/v{version:apiVersion}/ger")] public class caGerController [Route("~/api/ger/getDetail")] [Route("getDetail")] GetGerData 时才有效 但是,当使用网址api/v2.05/ger/getDetail并将消息显示为api/ger/getDetail

时,它无法正常工作

如果将版本从2.05更改为1.0(与所有其他控制器一样),则"Code": "ApiVersionUnspecified",可以正常工作。

如何解决这个问题,我需要2.05这个控制器,并且还需要访问api/ger/getDetail URL。

由于

1 个答案:

答案 0 :(得分:2)

由于您是按网址细分版本,因此您必须做一些事情。首先在选项中,您需要允许使用隐式版本控制:

options.DefaultApiVersion = new ApiVersion( 2, 0 );

您的原始API具有从未声明或命名的某些版本。默认配置将使用" 1.0"。如果您希望默认值为其他值,请指定:

[ApiVersion( "2.0" )]
[ApiVersion( "2.05" )]
[RoutePrefix( "api" )]
public class GerController : ApiController
{
    [Route( "ger/getDetails" )]
    [Route( "v{version:apiVersion}/ger/getDetails" )]
    public IHttpActionResult GetDetails() => Ok();
}

下一步是您必须浮动您希望拥有默认路径的控制器上的路由模板。 ASP.NET和我知道的所有其他堆栈都无法在路径模板中间提供或填充默认值。

如果" 2.0"是您的初始默认版本,然后您的控制器将如下所示:

    if let path : String = Bundle.main.path(forResource: "tiles", ofType: "json") {
                if let data = NSData(contentsOfFile: path) {
                    let optData = try? JSON(data: data as Data)
                    guard let json = optData else {
                        return
                    }
//If it is a JSON array of objects
                    for (_, object) in json {
                        let name = object["name"].stringValue
                        print(name)
                    }
                }
            }

如果更改映射到默认路由的控制器,则必须将路径模板移动到该新控制器类型。

这是通过URL细分进行版本控制的一个不幸后果。如果你不改变默认路线映射,那么管理它不应该是一件大事;否则,您应该考虑禁止隐式版本控制或选择备用版本控制方法。

有关详细信息,请参阅此wiki主题。