Attribute based routing registration with Service API

Attribute based routing registration with Service API

Member since: 2011

EPiServer Service API integration module provides a way to "delay" attribute based routing registartion and delegate that to some external code by adding following key to <appSettings>:

<add key="episerver:serviceapi:maphttpattributeroutes" value="false" />

However this seems not to work properly. Tried following solutions:

Added this code to following places:

GlobalConfiguration.Configure(config => config.MapHttpAttributeRoutes());

a) Added to Application_Start()

b) Added to overridden Global.RegisterRoutes()

c) Created initializable module with dependency to EPiServer.ServiceApi.IntegrationInitialization

Called directly GlobalConfiguration.Configuration.MapHttpAttributeRoutes() and then GlobalConfiguration.Configuration.EnsureInitialized().

None of these seems to have any effect.

ServiceApi services ends with error message like:

[InvalidOperationException: The object has not yet been initialized. Ensure that HttpConfiguration.EnsureInitialized() is called in the application's startup code after all other initialization code.]
   System.Web.Http.Routing.RouteCollectionRoute.get_SubRoutes() +101
   System.Web.Http.Routing.RouteCollectionRoute.GetRouteData(String virtualPathRoot, HttpRequestMessage request) +63
   System.Web.Http.WebHost.Routing.HttpWebRoute.GetRouteData(HttpContextBase httpContext) +107
   System.Web.Routing.RouteCollection.GetRouteData(HttpContextBase httpContext) +233
#139926 Oct 09, 2015 20:02
  • Member since: 2011

    I got it to work like this.  You need to make sure you call it before Configure.  Unfortunatley HttpConfiguration does not like when there are multiple => configure() called.

    using System;
    using System.Linq;
    using System.Web.Http;
    using EPiServer.Framework;
    using EPiServer.Framework.Initialization;
    namespace ServiceApi.Test.Business
        public class TestAttributeRouting : IInitializableModule
            public void Initialize(InitializationEngine context)
            public void Preload(string[] parameters) { }
            public void Uninitialize(InitializationEngine context)
                //Add uninitialization logic

    The main reason we added this was becasue if other third party libraries were calling MapAttirbutes then there would be an error.  If you are just using attibute routing then letting ServiceApi map them should be sufficient.

    #140228 Oct 13, 2015 22:37