我有路由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解析器来解析无效的路径,您将获得例外。
希望它能有所帮助。