Search code examples
c#asp.net-web-apiowinself-hostingasp.net-web-api-odata

How to configure OData end point in a self-hosted Web API application


I'm building an OWIN self-hosted Web API 2 service. I need for this service to expose OData end points.

The traditional IIS-hosted method involves App_Start/WebApiConfig.cs:

using ProductService.Models;
using System.Web.OData.Builder;
using System.Web.OData.Extensions;

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // New code:
        ODataModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntitySet<Product>("Products");
        config.MapODataServiceRoute(
            routeName: "ODataRoute",
            routePrefix: null,
            model: builder.GetEdmModel());
    }
}

However, in my self-hosted solution there is no such thing as WebApiConfig.cs

Where and how can I specify this OData configuration?


Solution

  • You're correct, there isn't necessarily such a thing as WebApiConfig.cs in a self-hosted OWIN project since you declare the middleware you need as you need it. However, if you're following OWIN self-hosting tutorials, you've probably bumped into the Startup.cs concept, which is what you can use, since you can instantiate your HttpConfiguration there.

    public class Startup 
    { 
        public void Configuration(IAppBuilder appBuilder) 
        { 
            // Configure Web API for self-host. 
            HttpConfiguration config = new HttpConfiguration(); 
            config.Routes.MapHttpRoute( 
                name: "DefaultApi", 
                routeTemplate: "api/{controller}/{id}", 
                defaults: new { id = RouteParameter.Optional } 
            );  
    
            ODataModelBuilder builder = new ODataConventionModelBuilder();
            builder.EntitySet<Product>("Products");
            config.MapODataServiceRoute(
            routeName: "ODataRoute",
            routePrefix: null,
            model: builder.GetEdmModel());
    
            appBuilder.UseWebApi(config);
        } 
    }