Dav*_*rds 2 routes dynamic odata asp.net-web-api
我有一个应用程序,我需要动态添加OData路由.我可以在Application_Start之后添加常规路由就好了,但是在使用OData路由时遇到了麻烦.
以下是我试图动态添加OData Web Api路由的方法.在我的WebApiConfig中,我添加了一个Products路线:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的ProductsController中,我在Products GET方法中添加以下调用,当我转到http:/// odata/Products时成功调用它(是的,有点奇怪,但是这是演示在Application_Start之后添加路由的一种方法):
GlobalConfiguration.Configure(WebApiConfig.AddOrderRoute);
Run Code Online (Sandbox Code Playgroud)
WebApiConfig.AddOrderRoute方法被正确调用并执行而没有错误:
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();
}
Run Code Online (Sandbox Code Playgroud)
所以你认为我现在正确配置了Orders路线.但是当我转到http:/// odata/Orders时,我收到以下错误:
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)
Run Code Online (Sandbox Code Playgroud)
请注意,我config.EnsureInitialized()在AddOrderRoute中调用.
我错过了什么?
注意:如果我在WebApiConfig.Register()方法的末尾调用AddOrderRoute,我的Orders路由可用并且正常工作,所以我知道我的Order实体,上下文和控制器工作正常.只有在我完成应用程序初始化后调用它才能解决问题.
好吧,我花了一些时间和好心人在MSDN上得到答案!
以下是Orders实体路由需要注册的方式:
var 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);
Run Code Online (Sandbox Code Playgroud)
尼斯.现在.../odata/Orders可以访问没问题.
| 归档时间: |
|
| 查看次数: |
5624 次 |
| 最近记录: |