我需要在应用程序启动后注册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);
}
答案 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(...)