【问题标题】:How to dispatch two different Odata routes to the same EntitySetController<TEntity, TKey>?如何将两个不同的 Odata 路由分派到同一个 EntitySetController<TEntity, TKey>?
【发布时间】:2013-02-20 03:31:29
【问题描述】:

同一控制器(例如 AnimalsController)可以处理不同的实体集(例如 Cats 和 Dogs)吗?

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

...

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

基本上,我需要能够声明两个不同的路由(/odata/cats 和 /odata/dogs),它们将到达同一个控制器。

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

谁能指出我实现这一结果的正确方向?

【问题讨论】:

    标签: asp.net-web-api odata


    【解决方案1】:

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

    public class AnimalControllerSelector : DefaultHttpControllerSelector
    {
        public override string GetControllerName(HttpRequestMessage request)
        {
            string controllerName = base.GetControllerName(request);
            if (controllerName == "Cats" || controllerName == "Dogs")
            {
                controllerName = "Animals";
            }
            return controllerName;
        }
    }
    

    注册:

    config.Services.Replace(typeof(IHttpControllerSelector), new AnimalControllerSelector());
    

    然后使用以下代码访问控制器中的实体集名称:

    string entitySetName = (ODataPath.Segments.First() as EntitySetPathSegment).EntitySetName;
    

    希望对您有所帮助。

    【讨论】:

    • 优素福:谢谢你的提示。但是,当我尝试使用此 link 作为实现您的想法的起点时,我得到一个异常(“the-controller-for-path-was-not-found-or-does-not-implement-icontroller”)当使用 Fiddler 到达“odata”端点时。有什么想法吗?
    • 这是一个 MVC 错误,而不是 Web API 错误...尝试删除您的 MVC 路由或让它们在您的 OData 路由之后运行,因为看起来它们正在捕获请求。查找 MapRoute 调用。
    • 现在工作正常。事实上,问题来自于常规的 MVC 路由。再次感谢您。
    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 2020-11-19
    • 2017-09-09
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    相关资源
    最近更新 更多