Wie füge ich OData Web Api-Routen dynamisch * nach * Application_Start hinzu?

Ich habe eine Anwendung, in der ich OData-Routen dynamisch hinzufügen muss. ich kann hinzufügenregulär Routen nach Application_Start ganz gut, aber ich habe Probleme damitOData Routen.

Hier ist, wie ich versuche, OData Web Api-Routen dynamisch hinzuzufügen. In meiner WebApiConfig füge ich eine Produktroute hinzu:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        var builder = new ODataConventionModelBuilder();
        builder.EntitySet<Product>("Products");
        config.MapODataServiceRoute(routeName: "ProductsRoute", routePrefix: "odata", model: builder.GetEdmModel());
    }
}

Dann füge ich in meinem ProductsController den folgenden Aufruf in die Products GET-Methode ein, der erfolgreich aufgerufen wird, wenn ich zu http: /// odata / Products gehe ):

GlobalConfiguration.Configure(WebApiConfig.AddOrderRoute);

Die WebApiConfig.AddOrderRoute-Methode wird korrekt aufgerufen und ohne Fehler ausgeführt:

public static void AddOrderRoute(HttpConfiguration config)
{
    var builder = new ODataConventionModelBuilder();
    builder.EntitySet<Order>("Orders");
    config.MapODataServiceRoute(routeName: "OrdersRoute", routePrefix: "odata", model: builder.GetEdmModel());
    config.EnsureInitialized();
}

Sie würden also denken, dass ich jetzt eine korrekt konfigurierte Bestellroute habe. Wenn ich jedoch zu http: /// odata / Orders gehe, wird der folgende Fehler angezeigt:

ExceptionMessage=The object has not yet been initialized. 
Ensure that HttpConfiguration.EnsureInitialized() is called in the 
application's startup code after all other initialization code.

StackTrace=   at System.Web.OData.Routing.Conventions.AttributeRoutingConvention.get_AttributeMappings()
   at System.Web.OData.Routing.Conventions.AttributeRoutingConvention.SelectController(ODataPath odataPath, HttpRequestMessage request)
   at System.Web.OData.Routing.ODataPathRouteConstraint.SelectControllerName(ODataPath path, HttpRequestMessage request)
   at System.Web.OData.Routing.ODataPathRouteConstraint.Match(HttpRequestMessage request, IHttpRoute route, String parameterName, IDictionary`2 values, HttpRouteDirection routeDirection)
   at System.Web.Http.Routing.HttpRoute.ProcessConstraint(HttpRequestMessage request, Object constraint, String parameterName, HttpRouteValueDictionary values, HttpRouteDirection routeDirection)
   at System.Web.Http.Routing.HttpRoute.ProcessConstraints(HttpRequestMessage request, HttpRouteValueDictionary values, HttpRouteDirection routeDirection)
   at System.Web.Http.Routing.HttpRoute.GetRouteData(String virtualPathRoot, HttpRequestMessage request)
   at System.Web.Http.WebHost.Routing.HttpWebRoute.GetRouteData(HttpContextBase httpContext)

Beachten Sie, dass ich anrufeconfig.EnsureInitialized() in AddOrderRoute.

Was vermisse ich?

HINWEIS: Wenn ich AddOrderRoute am Ende der WebApiConfig.Register () -Methode aufrufe, ist meine Orders-Route verfügbar und funktioniert, sodass ich weiß, dass meine Order-Entität, mein Kontext und mein Controller einwandfrei funktionieren. Erst wenn ich es nach Abschluss der Anwendungsinitialisierung aufrufe, bekomme ich das Problem.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage