Пользовательская функция Odata v4 — недопустимый шаблон маршрута odata — ресурс для сегмента не найден

Я имею в виду что-то вроде этого (действие само по себе, наверное, нормально)

    [HttpPost]
    [ODataRoute("GenerateFromProduct")]
    public async Task<IHttpActionResult> GenerateFromProduct([FromBodyAttribute] Product product)
    {
        if(!ModelState.IsValid)
        {
            return BadRequest();
        }

        List<string[]> combos = new List<string[]>();
        List<ProductVariant> productVariants = product.GenerateProductVariants();
        db.ProductVariants.AddRange(productVariants);

        await db.SaveChangesAsync();

        return Ok(productVariants);
    }

Действие, определенное в WebApiConfig, вероятно, будет примерно таким:

 builder.EntityType<ProductVariant>().Collection
 .Function("GenerateFromProduct").Returns<List<ProductVariant>>().EntityParameter<Product>("product");

Но я продолжаю получать следующую ошибку (после нескольких перезаписей)

An exception of type 'System.InvalidOperationException' occurred in System.Web.OData.dll but was not handled in user code

Additional information: The path template 'GenerateFromProduct' on the action 'GenerateFromProduct' in controller 'ProductVariants' is not a valid OData path template. Resource not found for the segment 

Любые идеи, что я делаю неправильно? Я не нашел много информации в Интернете об odata и пользовательских функциях / действиях, кроме тех, что есть в msdn.


person NicoJuicy    schedule 08.10.2015    source источник


Ответы (1)


@NicoJuicy

Ваш код:

builder.EntityType<ProductVariant>().Collection.Function("GenerateFromProduct")...

заключается в определении функции Bound. Связанная функция похожа на метод экземпляра, который вызывается экземпляром.

Аналогично, шаблон Uri в ODataRoute должен совпадать с uri связанной функции. Итак, должно быть:

 [ODataRoute("ProductVariants/YourNameSpace.GenerateFromProduct(product={product}")]

Кроме того, функция используется только в сценарии GET, поэтому [HttpPost] не подходит для функции.

Возможно, следующий материал поможет вам понять функцию/действие в OData:

А следующие материалы помогут вам понять параметры функции/действия:

А следующие материалы помогут вам понять маршрутизацию атрибутов:

person Sam Xu    schedule 12.10.2015
comment
Я добился некоторого прогресса в маршрутизации (сделал первые функции - связанные и несвязанные, но у меня есть дополнительный вопрос по stackoverflow.com/questions/33137197/ . Я буду считать этот ответ действительным, потому что мое понимание маршрутов и конфигурации в функциях было / есть все еще несколько ограничено. Теперь я знаю, что связанные функции ожидают, что объект будет возвращен (или модель). Все еще странно, что функции/действия odataController должны быть объявлены отдельно в WebApiConfig, за исключением случаев, когда они также находятся в модели - person NicoJuicy; 15.10.2015
comment
PS. Мне не хватает некоторых практических примеров в документации или на github. Например. я нигде не нашел, как я могу объявить необязательный параметр, который обрабатывает маршрут, например [ODataRoute(Products({key})/GenerateVariants({save?})] . Я не хочу показаться неблагодарным, odata рулит, но некоторые вещи непонятны :-) - person NicoJuicy; 15.10.2015
comment
необязательный параметр не поддерживается. Однако вы можете определить, что параметр может принимать значение NULL. например int?. - person Sam Xu; 16.10.2015