Asp.net web api 如何将两条不同的Odata路由分派到同一实体SetController?

Asp.net web api 如何将两条不同的Odata路由分派到同一实体SetController?,asp.net-web-api,odata,Asp.net Web Api,Odata,是否可能由同一控制器(如AnimalsController)处理不同的实体集(如猫和狗) public class AnimalsController : EntitySetController<Animal, int> { } 基本上,我需要能够声明两条不同的路线/odata/猫和/odata/狗,它们将到达同一控制器 一旦进入控制器,我需要一种方法来检索路由上下文,以确定该方法是否返回猫或狗 有人能给我指出实现这一结果的正确方向吗?我通常建议每个要公开的实体集都有一个Web

是否可能由同一控制器(如AnimalsController)处理不同的实体集(如猫和狗)

public class AnimalsController : EntitySetController<Animal, int>
{
}

基本上,我需要能够声明两条不同的路线/odata/猫和/odata/狗,它们将到达同一控制器

一旦进入控制器,我需要一种方法来检索路由上下文,以确定该方法是否返回猫或狗


有人能给我指出实现这一结果的正确方向吗?

我通常建议每个要公开的实体集都有一个Web API控制器。但是,如果您真的必须将请求映射到同一个控制器,我会这样做。定义以下控制器选择器:

公共类AnimalControllerSelector:DefaultHttpControllerSelector { 公共重写字符串GetControllerNameHttpRequestMessage请求 { 字符串controllerName=base.GetControllerNamerequest; 如果控制器名称==猫| |控制器名称==狗 { 控制器名称=动物; } 返回控制器名称; } } 注册:

config.Services.replaceTypeofHittpControllerSelector,新的AnimalControllerSelector; 然后使用以下代码访问控制器中的实体集名称:

字符串entitySetName=ODataPath.Segments.First作为EntitySetPathSegment.entitySetName;
希望这会有所帮助。

我通常建议每个要公开的实体设置一个Web API控制器。但是,如果您真的必须将请求映射到同一个控制器,我会这样做。定义以下控制器选择器:

公共类AnimalControllerSelector:DefaultHttpControllerSelector { 公共重写字符串GetControllerNameHttpRequestMessage请求 { 字符串controllerName=base.GetControllerNamerequest; 如果控制器名称==猫| |控制器名称==狗 { 控制器名称=动物; } 返回控制器名称; } } 注册:

config.Services.replaceTypeofHittpControllerSelector,新的AnimalControllerSelector; 然后使用以下代码访问控制器中的实体集名称:

字符串entitySetName=ODataPath.Segments.First作为EntitySetPathSegment.entitySetName;
希望能有所帮助。

谢谢你的提示。但是,当我尝试将此作为实现您想法的起点时,我遇到了一个异常,即未找到path的控制器,或者在使用Fiddler到达odata端点时未实现icontroller。知道吗?那是MVC错误,不是Web API错误。。。尝试删除MVC路由或让它们在OData路由之后运行,因为它们看起来像是在捕获请求。查找MapRoute呼叫。现在工作正常。事实上,问题来自常规MVC路线。谢谢你的提示。但是,当我尝试将此作为实现您想法的起点时,我遇到了一个异常,即未找到path的控制器,或者在使用Fiddler到达odata端点时未实现icontroller。知道吗?那是MVC错误,不是Web API错误。。。尝试删除MVC路由或让它们在OData路由之后运行,因为它们看起来像是在捕获请求。查找MapRoute呼叫。现在工作正常。事实上,问题来自常规MVC路线。再次感谢你。
ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
modelBuilder.EntitySet<Animal>("Cats");
modelBuilder.EntitySet<Animal>("Dogs");

Microsoft.Data.Edm.IEdmModel model = modelBuilder.GetEdmModel();
config.Routes.MapODataRoute("ODataRoute", "odata", model);