-
Notifications
You must be signed in to change notification settings - Fork 703
API Versioning with OData
Service API versioning using OData v4.0 is similar to the normal configuration with a few slight variations. Each implemented OData controller has an associated entity set and each entity set is defined in an Entity Data Model (EDM). Once we introduce API versioning, each versioned OData controller now needs an EDM per API version. To satisfy this requirement, we'll use the new VersionedODataModelBuilder, build a collection of EDMs for each API version, and then map a set of routes for them.
public class Startup
{
public void Configuration( IAppBuilder appBuilder )
{
var configuration = new HttpConfiguration();
var httpServer = new HttpServer( configuration );
configuration.AddApiVersioning();
var modelBuilder = new VersionedODataModelBuilder( configuration )
{
ModelConfigurations =
{
new PersonModelConfiguration()
}
};
var models = modelBuilder.GetEdmModels();
configuration.MapVersionedODataRoutes( "odata", "api", models );
appBuilder.UseWebApi( httpServer );
}
}
public class Startup
{
public void ConfigureServices( IServiceCollection services )
{
services.AddMvcCore();
services.AddApiVersioning();
services.AddOData().EnableApiVersioning();
}
public void Configure( IApplicationBuilder app )
{
var modelBuilder = new VersionedODataModelBuilder()
{
ModelConfigurations =
{
new PersonModelConfiguration()
}
};
var models = modelBuilder.GetEdmModels();
app.UseMvc( routes => routes.MapVersionedODataRoutes( "odata", "api", models ) );
}
}
OData defines route prefixes when the routes are mapped. To use a route prefix, you need to either explicitly build up an EDM for a specific API version. In earlier versions of API versioning, the route constraint name must be apiVersion
. Beginning in 3.0, you can customize the route constraint name in the ApiVersioningOptions.
public class Startup
{
public void Configuration( IAppBuilder appBuilder )
{
var configuration = new HttpConfiguration();
var httpServer = new HttpServer( configuration );
configuration.AddApiVersioning();
var modelBuilder = new ODataConventionModelBuilder();
var modelConfigurations = new[] { new PersonModelConfiguration() };
var apiVersion = new ApiVersion( 1, 0 );
foreach ( var modelConfiguration in modelConfigurations )
{
modelConfiguration.Apply( modelBuilder, apiVersion );
}
var model = modelBuilder.GetEdmModel();
configuration.MapVersionedODataRoute( "odata-bypath", "v{apiVersion}", model, apiVersion );
appBuilder.UseWebApi( httpServer );
}
}
public class Startup
{
public void ConfigureServices( IServiceCollection services )
{
services.AddMvcCore();
services.AddApiVersioning();
services.AddOData().EnableApiVersioning();
}
public void Configure( IApplicationBuilder app )
{
var modelBuilder = new ODataConventionModelBuilder();
var modelConfigurations = new[] { new PersonModelConfiguration() };
var apiVersion = new ApiVersion( 1, 0 );
foreach ( var modelConfiguration in modelConfigurations )
{
modelConfiguration.Apply( modelBuilder, apiVersion );
}
var model = modelBuilder.GetEdmModel();
app.UseMvc( routes => routes.MapVersionedODataRoute( "odata", "v{version:apiVersion}", model, apiVersion ) );
}
}
or build the EDMs for all API versions.
public class Startup
{
public void Configuration( IAppBuilder appBuilder )
{
var configuration = new HttpConfiguration();
var httpServer = new HttpServer( configuration );
configuration.AddApiVersioning();
var modelBuilder = new VersionedODataModelBuilder( configuration )
{
ModelConfigurations =
{
new PersonModelConfiguration()
}
};
var models = modelBuilder.GetEdmModels();
configuration.MapVersionedODataRoute( "odata-bypath", "v{apiVersion}", models );
appBuilder.UseWebApi( httpServer );
}
}
public class Startup
{
public void ConfigureServices( IServiceCollection services )
{
services.AddMvcCore();
services.AddApiVersioning();
services.AddOData().EnableApiVersioning();
}
public void Configure( IApplicationBuilder app )
{
var modelBuilder = new VersionedODataModelBuilder()
{
ModelConfigurations =
{
new PersonModelConfiguration()
}
};
var models = modelBuilder.GetEdmModels();
app.UseMvc( routes => routes.MapVersionedODataRoutes( "odata", "v{version:apiVersion}", models ) );
}
}
The remainder of the OData configuration and setup remains unchanged.
- Home
- Quick Starts
- Version Format
- Version Discovery
- Version Policies
- How to Version Your Service
- API Versioning with OData
- Configuring Your Application
- Error Responses
- API Documentation
- Extensions and Customizations
- Known Limitations
- FAQ
- Examples