C# 使用自定义路由返回实现ODataController“;从OData路径中找不到相关实体集;错误
我正试图从当前的ApicController实现转移到ODataController,因为这是我发现的唯一能够返回ODataJSON格式数据的方法。(与问题相同,但解决方案对我不起作用) 我一直在尝试使用ODataController,我发现它在以下方面工作得很好。但是,我的项目实现了与简单“~/OData/Entity”的默认OData路由不同的路由。我需要将我的控制器分组到多个区域,因为有些控制器的名称重复 在和之后,我能够实现自定义路由,并且运行它似乎能够到达正确的控制器并成功地通过它。然而,我仍然得到一个错误,在小提琴的 “ObjectContent`1'类型未能序列化的响应正文 内容类型“application/json;odata=minimalmetadata;streaming=true; 字符集=utf-8'。” 除了 从OData路径中找不到相关实体集。这个 序列化有效负载需要相关实体集 现在我已经被它困了好几个小时了。没有路由处理程序,只需通过“~/odata/Entity”访问数据,我的代码就可以很好地工作。当我实现自定义路由时,它在通过我的控制器代码后失败 任何帮助都将不胜感激 下面是一些代码: Global.asax:C# 使用自定义路由返回实现ODataController“;从OData路径中找不到相关实体集;错误,c#,json,asp.net-web-api,odata,C#,Json,Asp.net Web Api,Odata,我正试图从当前的ApicController实现转移到ODataController,因为这是我发现的唯一能够返回ODataJSON格式数据的方法。(与问题相同,但解决方案对我不起作用) 我一直在尝试使用ODataController,我发现它在以下方面工作得很好。但是,我的项目实现了与简单“~/OData/Entity”的默认OData路由不同的路由。我需要将我的控制器分组到多个区域,因为有些控制器的名称重复 在和之后,我能够实现自定义路由,并且运行它似乎能够到达正确的控制器并成功地通过它。然
//Added this on App_Start
config.Services.Replace(typeof(IHttpControllerSelector), new CustomHttpControllerSelector(config));
//Snippet from RegisterRoutes
ODataConventionModelBuilder modelBuilder = new ODataConventionModelBuilder();
modelBuilder.EntitySet<Entity>("Entities");
IEdmModel model = modelBuilder.GetEdmModel();
config.Routes.MapODataRoute(
routeName: "ODataDefault",
routePrefix: "{version}/{area}/{controller}", //Works since I could reach my controller
model: model);
最终解决了这个问题,只需删除routePrefix的{controller}部分,并在路由的初始解析未检测到控制器值时实现自定义IODataRoutingConvention以输入默认控制器值。代码如下:
public string SelectController(ODataPath odataPath, HttpRequestMessage request)
{
string controllerName = ""
//do stuff here to select controller
return controllerName;
}
我猜这是ApiController映射路由中默认参数和约束参数的长替换
RouteTable.Routes.MapHttpRoute(
name: "RouteName",
routeTemplate: "{version}/{area}/{controller}",
defaults: new { controller = controllerName },
constraints: new { version = v1 }
);
注意:现在将此作为答案发布,但如果有人有更好的解释,我会检查它。:) 你能分享一份复印件样品吗?此外,共享自定义路由约定代码也可能会有所帮助。@RaghuRamNadiminti,谢谢回复。我编辑了我的一些代码,其中一些修改是我在这里摸索的。虽然我不能发布我所有的代码,但是发布的时间太长了,但是我添加了我实现的新路由。仍然可以在正确的控制器上获得精确的方法,但是当它返回到客户端时仍然是一个错误。这个答案对我很有帮助,尽管我有一个稍微不同的问题。我想要一个url的上下文(例如,我想知道用户是否在基于url的组中),使用MapODataRoute并给出routePrefix:“odata/{myKeyIWanted}”,然后对其进行过滤,使我能够从该位置推/拉值。谢谢
public string SelectController(ODataPath odataPath, HttpRequestMessage request)
{
string controllerName = ""
//do stuff here to select controller
return controllerName;
}
RouteTable.Routes.MapHttpRoute(
name: "RouteName",
routeTemplate: "{version}/{area}/{controller}",
defaults: new { controller = controllerName },
constraints: new { version = v1 }
);