private static void ConfigureWebApiOData(HttpConfiguration config) { var controllerSelector = new ODataVersionControllerSelector(config); config.Services.Replace(typeof(IHttpControllerSelector), controllerSelector); // Define a versioned route config.MapODataServiceRoute("V1RouteVersioning", "odata/v1", GetVersionedModel()); controllerSelector.RouteVersionSuffixMapping.Add("V1RouteVersioning", "V1"); // Define a versioned route that doesn't map to any controller config.MapODataServiceRoute("odata/v2", "odata/v2", GetFakeModel()); controllerSelector.RouteVersionSuffixMapping.Add("odata/v2", "V2"); // Define a custom route with custom routing conventions var conventions = ODataRoutingConventions.CreateDefault(); conventions.Insert(0, new CustomNavigationPropertyRoutingConvention()); var customODataRoute = config.MapODataServiceRoute("CustomODataRoute", ODataRoutePrefix, GetCustomRouteModel(), batchHandler: null, pathHandler: new DefaultODataPathHandler(), routingConventions: conventions); config.AddCustomSwaggerRoute(customODataRoute, "/Customers({Id})/Orders") .Operation(HttpMethod.Post) .PathParameter<int>("Id") .BodyParameter<Order>("order"); // Define a route to a controller class that contains functions config.MapODataServiceRoute("FunctionsODataRoute", ODataRoutePrefix, GetFunctionsEdmModel()); // Define a default non- versioned route(default route should be at the end as a last catch-all) config.MapODataServiceRoute("DefaultODataRoute", ODataRoutePrefix, GetDefaultModel()); }
private static void ConfigureWebApiOData(HttpConfiguration config) { var controllerSelector = new ODataVersionControllerSelector(config); config.Services.Replace(typeof(IHttpControllerSelector), controllerSelector); // Define a versioned route config.MapODataServiceRoute("V1RouteVersioning", "odata/v1", GetVersionedModel()); controllerSelector.RouteVersionSuffixMapping.Add("V1RouteVersioning", "V1"); // Define a versioned route that doesn't map to any controller config.MapODataServiceRoute("odata/v2", "odata/v2", GetFakeModel()); controllerSelector.RouteVersionSuffixMapping.Add("odata/v2", "V2"); // Define a custom route with custom routing conventions var conventions = ODataRoutingConventions.CreateDefault(); conventions.Insert(0, new CustomNavigationPropertyRoutingConvention()); var customODataRoute = config.MapODataServiceRoute("CustomODataRoute", ODataRoutePrefix, GetCustomRouteModel(), batchHandler: null, pathHandler: new DefaultODataPathHandler(), routingConventions: conventions); config.AddCustomSwaggerRoute(customODataRoute, "/Customers({Id})/Orders") .Operation(HttpMethod.Post) .PathParameter<int>("Id") .BodyParameter<Order>("order"); // Define a route to a controller class that contains functions config.MapODataServiceRoute("FunctionsODataRoute", ODataRoutePrefix, GetFunctionsEdmModel()); // Define a default non- versioned route(default route should be at the end as a last catch-all) config.MapODataServiceRoute("DefaultODataRoute", ODataRoutePrefix, GetDefaultModel()); bool isPrefixFreeEnabled = System.Convert.ToBoolean(WebConfigurationManager.AppSettings["EnableEnumPrefixFree"]); var uriResolver = isPrefixFreeEnabled ? new StringAsEnumResolver() : new ODataUriResolver(); // Define a route with an enum as a key const string enumRouteName = "EnumODataRoute"; config.MapODataServiceRoute(enumRouteName, ODataRoutePrefix, builder => builder .AddService(ServiceLifetime.Singleton, sp => GetProductWithEnumKeyModel()) .AddService(ServiceLifetime.Singleton, sp => (IEnumerable<IODataRoutingConvention>)ODataRoutingConventions.CreateDefaultWithAttributeRouting(enumRouteName, config)) .AddService(ServiceLifetime.Singleton, sp => uriResolver)); // Define a route with an enum/int composite key const string enumIntCompositeRouteName = "EnumIntCompositeODataRoute"; config.MapODataServiceRoute(enumIntCompositeRouteName, ODataRoutePrefix, builder => builder .AddService(ServiceLifetime.Singleton, sp => GetProductWithCompositeEnumIntKeyModel()) .AddService(ServiceLifetime.Singleton, sp => (IEnumerable<IODataRoutingConvention>)ODataRoutingConventions.CreateDefaultWithAttributeRouting(enumIntCompositeRouteName, config)) .AddService(ServiceLifetime.Singleton, sp => uriResolver)); }
/// <summary> /// This code configures Web API. /// The TestWebApiStartup class is specified as a type parameter in the WebApp.Start method. /// </summary> /// <param name="appBuilder">The application builder.</param> public async void NorthwindConfiguration(IAppBuilder appBuilder) { var config = new HttpConfiguration { IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always }; var server = new HttpServer(config); WebApiConfig.Register(config); appBuilder.UseWebApi(server); config .EnableSwagger(c => { // Use "SingleApiVersion" to describe a single version API. Swagger 2.0 includes an "Info" object to // hold additional metadata for an API. Version and title are required but you can also provide // additional fields by chaining methods off SingleApiVersion. // c.SingleApiVersion("v1", "A title for your API"); // Wrap the default SwaggerGenerator with additional behavior (e.g. caching) or provide an // alternative implementation for ISwaggerProvider with the CustomProvider option. // c.CustomProvider(defaultProvider => new ODataSwaggerProvider(defaultProvider, c, config)); }) .EnableSwaggerUi(); FormatterConfig.Register(config); config.Services.Replace(typeof(IHttpControllerSelector), new RestierControllerSelector(config)); var customSwaggerRoute = await config.MapRestierRoute<EntityFrameworkApi<NorthwindContext>>("RESTierRoute", "restier", new RestierBatchHandler(server)); config.AddCustomSwaggerRoute(customSwaggerRoute, "/Customers({CustomerId})/Orders({OrderId})") .Operation(HttpMethod.Get) .PathParameter<string>("CustomerId") .PathParameter<int>("OrderId"); config.EnsureInitialized(); }