在没有密钥的情况下访问ODATA实体的属性时,找不到404



我有路由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提出请求时,例如

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

都可以正常工作,我得到了结果,但是如果我想做出

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

我没有404个例外

您有任何想法吗?

mykhailo

这与ODATA URL约定有关。有关属性访问的URL大会,您可以参考http://docs.oasis-open.org/odata/odata/v4.01/cs01/part2-url-conventions/odata-v4.01-cs01-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解析器来解析无效的路径,您将获得例外。

希望它能有所帮助。

最新更新