在没有密钥的情况下访问OData实体的属性时获取404 Not Found

时间:2018-12-20 14:53:12

标签: c# asp.net-core odata asp.net-core-routing

我将路由OData问题与ASP.NET Core结合使用。我有以下课程

public class Publisher
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Category Category { get; set; }
}

public class Category
{
    public int Id { get; set; }
    public string Type { get; set; }
}

配置为

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
   ...
   app.UseMvc(b =>
   {
        b.Select().Expand().Filter().OrderBy().MaxTop(100).Count();
        b.MapODataServiceRoute(routeName: "myRoute", routePrefix: "odata", model: GetEdmModel());
   });
}

private static IEdmModel GetEdmModel()
{
    ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
    builder.EntitySet<Publisher>("Publisher");
    builder.EntitySet<Category>("Category");
    return builder.GetEdmModel();
}

当然还有控制器

public class PublisherController : ODataController
{
    [EnableQuery]
    public ActionResult<string> GetCategory()
    {
        return _db.Publishers.Select(p => p.Category);
    }

    [EnableQuery]
    public ActionResult<string> GetCategory([FromODataUri] int key)
    {
        return Ok(_db.Publishers.Where(p => p.Id == key).Select(p => p.Category));
    }
}

问题是,当我尝试使用特定ID发出GET请求时,例如

http://localhost:port/odata/Publisher(1)/Category

一切正常,我得到了结果,但是如果我想做

http://localhost:port/odata/Publisher/Category

我有404未找到异常

您有什么想法吗?

1 个答案:

答案 0 :(得分:0)

米哈伊洛

这与OData Url约定有关。有关属性访问的Url约定,您可以参考http://docs.oasis-open.org/odata/odata/v4.01/cs01/part2-url-conventions/odata-v4.01-cs01-part2-url-conventions.html#_Toc505773205以获得详细信息。

http://...../Category用于访问属性。基本上,我们可以从实体访问属性。 Publisher(1)是键值为1的实体,而Publisher是整个实体集。因此,http://localhost:port/odata/Publisher(1)/Category是有效的OData Url路径,但是http://localhost:port/odata/Publisher/Category无效。如果使用ODL Uri解析器解析无效路径,则会得到异常。

希望它可以提供帮助。