C# 使用自定义路由返回实现ODataController“;从OData路径中找不到相关实体集;错误

C# 使用自定义路由返回实现ODataController“;从OData路径中找不到相关实体集;错误,c#,json,asp.net-web-api,odata,C#,Json,Asp.net Web Api,Odata,我正试图从当前的ApicController实现转移到ODataController,因为这是我发现的唯一能够返回ODataJSON格式数据的方法。(与问题相同,但解决方案对我不起作用) 我一直在尝试使用ODataController,我发现它在以下方面工作得很好。但是,我的项目实现了与简单“~/OData/Entity”的默认OData路由不同的路由。我需要将我的控制器分组到多个区域,因为有些控制器的名称重复 在和之后,我能够实现自定义路由,并且运行它似乎能够到达正确的控制器并成功地通过它。然

我正试图从当前的ApicController实现转移到ODataController,因为这是我发现的唯一能够返回ODataJSON格式数据的方法。(与问题相同,但解决方案对我不起作用)

我一直在尝试使用ODataController,我发现它在以下方面工作得很好。但是,我的项目实现了与简单“~/OData/Entity”的默认OData路由不同的路由。我需要将我的控制器分组到多个区域,因为有些控制器的名称重复

在和之后,我能够实现自定义路由,并且运行它似乎能够到达正确的控制器并成功地通过它。然而,我仍然得到一个错误,在小提琴的

“ObjectContent`1'类型未能序列化的响应正文 内容类型“application/json;odata=minimalmetadata;streaming=true; 字符集=utf-8'。”

除了

从OData路径中找不到相关实体集。这个 序列化有效负载需要相关实体集

现在我已经被它困了好几个小时了。没有路由处理程序,只需通过“~/odata/Entity”访问数据,我的代码就可以很好地工作。当我实现自定义路由时,它在通过我的控制器代码后失败

任何帮助都将不胜感激

下面是一些代码:

Global.asax:

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