2015-05-22 7 views
0

Мне нужно зарегистрировать веб-службу OData после запуска приложения. В случае динамического конфигурирования EntitySets и т.д.Добавить маршруты OData Web Api * после * Application_Start?

Если я зарегистрировать его в обычном порядке

GlobalConfiguration.Configure(WebApiConfig.Register); 
RouteConfig.RegisterRoutes(RouteTable.Routes); 

Это работает нормально, но у меня нет всей информации о моем EdmModel при запуске, так что я хочу зарегистрируйте его позже. (Администратором выбора OData модели, например)

Но, если я зарегистрировать его после

RouteConfig.RegisterRoutes(RouteTable.Routes); 
GlobalConfiguration.Configure(WebApiConfig.Register); 

Это не сработало.

Я попытался использовать решение от How to dynamically add OData Web Api routes *after* Application_Start? , но он также не работал.

Я пытался что-то вроде

void Application_Start(object sender, EventArgs e) 
    { 
     // Code that runs on application startup 
     AreaRegistration.RegisterAllAreas(); 
     GlobalConfiguration.Configure(WebApiConfig.Register); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     GlobalConfiguration.Configure(WebApiConfig.Register2); 
    } 

и

public static void Register(HttpConfiguration config) 
    { 
     config.MapHttpAttributeRoutes(); 
     config.Routes.MapHttpRoute(name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }); 

     var builder = new ODataConventionModelBuilder(); 
     builder.EntitySet<Product>("Products"); 
     config.MapODataServiceRoute(routeName: "ProductsRoute", routePrefix: "odata", model: builder.GetEdmModel()); 
    } 

    public static void Register2(HttpConfiguration config) 
    { 
     ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); 
     builder.EntitySet<Order>("Orders"); 

     var route = config.Routes.Where(r => r is System.Web.OData.Routing.ODataRoute).First(); 
     var odataRoute = route as System.Web.OData.Routing.ODataRoute; 

     config.MapODataServiceRoute(routeName: "OrdersRoute", routePrefix: "odata", model: builder.GetEdmModel(), pathHandler: odataRoute.PathRouteConstraint.PathHandler, routingConventions: odataRoute.PathRouteConstraint.RoutingConventions); 
     //config.EnsureInitialized(); - commented or not commented same result 
    } 
+0

Вы выяснили, как динамически _remove_ маршрут OData после того, как он был добавлен? –

ответ

0

я нашел решение, в первой книге пустой модели:

public static void Register(HttpConfiguration config) 
    { 
     ODataModelBuilder builder = new ODataConventionModelBuilder(); 
     var edmModel = builder.GetEdmModel(); 
     config.MapODataServiceRoute(routeName: "ODataRoute", routePrefix: "odata", model: edmModel, pathHandler: new DefaultODataPathHandler(), routingConventions: new[] { new CustomControllerRoutingConvention() }); 
    } 

, а затем я мог зарегистрировать другую модель в любое время с

 var edmModel = builder.GetEdmModel(); 
     var odataRoute = GlobalConfiguration.Configuration.Routes.OfType<ODataRoute>().First(); 
     var constr = odataRoute.Constraints; 
     var pathRouteConstraint = new ODataPathRouteConstraint(odataRoute.PathRouteConstraint.PathHandler, edmModel, "ODataRoute", odataRoute.PathRouteConstraint.RoutingConventions); 
     constr["ODataConstraint"] = pathRouteConstraint; 

без вызова config.MapODataServiceRoute (...)

Смежные вопросы