Получить 404 Not Found при доступе к свойству объекта OData без ключа - PullRequest
0 голосов
/ 20 декабря 2018

У меня проблема с маршрутизацией 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));
    }
}

Проблема в том, что когда я пытаюсь сделать GETзапрос с конкретным идентификатором, например

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

все работает нормально, и я получаю результат, но если я пытаюсь сделать

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

, у меня есть 404 исключение Not Found

У тебя есть мысли?

1 Ответ

0 голосов
/ 21 декабря 2018

Михаил

Это связано с соглашением OData Url.для соглашения URL о доступе к свойству, вы можете обратиться к http://docs.oasis -open.org / odata / odata / v4.01 / cs01 / part2-url-Conventions / odata-v4.01-cs01-part2-Для получения подробной информации url-конвенции.html # _Toc505773205 .

http://...../Category - для доступа к свойству.По сути, мы можем получить доступ к свойству от объекта.Publisher(1) - это сущность, значение ключа которой равно 1, а Publisher - это весь набор сущностей.Таким образом, http://localhost:port/odata/Publisher(1)/Category является допустимым URL-адресом OData, но http://localhost:port/odata/Publisher/Category недопустим.Если вы используете синтаксический анализатор ODL Uri для анализа неверного пути, вы получите исключение.

Надеюсь, что это поможет.

...