在* Application_Start之后添加OData Web Api路由*?

时间:2015-05-22 08:23:02

标签: asp.net-mvc routes asp.net-mvc-routing odata

我需要在应用程序启动后注册OData Web服务。 在动态配置EntitySets等的情况下

如果我以常规方式注册

$url.match('/([^?&]*)' + name.toSearch + '/g') // toSearch is a value like question-1

它工作正常,但我在启动时没有关于我的EdmModel的所有信息,所以我想稍后注册。 (例如,管理员选择OData模型)

但是,如果我在

之后注册它
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);

它不起作用。

我尝试使用来自How to dynamically add OData Web Api routes *after* Application_Start?的解决方案 但它也没有用。

我试过像

这样的东西
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);

    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);
    }

1 个答案:

答案 0 :(得分: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(...)