У меня есть проект Web Api 2.2, работающий с OData v4. Обычная конфигурация EntitySet работает по желанию со всеми глаголами http. Там, где у меня проблема, вы пытаетесь открыть пользовательскую функцию. Я начал пытаться сделать что-то отличное от стандартных примеров, но я полностью поддержал это, пытаясь заставить работать базовый пример.Web Api 2.2 OData V4 Функция Маршрутизация
Вот мой запуск конфигурации (прямо из примеров MS):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using System.Web.OData.Builder;
using System.Web.OData.Extensions;
namespace Test.Service
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// other entitysets that don't have functions
builder.EntitySet<Product>("Products");
builder.Namespace = "ProductService";
builder.EntityType<Product>().Collection
.Function("MostExpensive")
.Returns<double>();
config.MapODataServiceRoute(
"odataroute"
, "odata"
, builder.GetEdmModel()
);
}
}
}
А вот мой контроллер:
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.OData;
namespace Test.Service.Controllers
{
public class ProductsController : ODataController
{
private EntityContext db = new EntityContext();
[EnableQuery]
public IQueryable<Product> GetProducts()
{
return db.Products;
}
[HttpGet]
public IHttpActionResult MostExpensive()
{
double test = 10.3;
return Ok(test);
}
}
}
Регулярное GET, работает отлично:
http://something/odata/Products
Однако следующее всегда дает мне 404:
Я пробовал любое количество разных вещей с пространством имен и т. Д. Итак, он не работает, как и все примеры, но я в недоумении, как копать глубже, чтобы выяснить что происходит не так. Метаданные, выставленные http://something/odata
, не дают никаких подсказок. Есть ли другой способ узнать, где (и как) эта функция должна быть раскрыта?
EDIT: Вот ссылка на Microsoft примера я следующее: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/odata-actions-and-functions
Просто интересно, вы пробовали: http: // something/odata/Продукты/MostOpensive? –
Да, я пробовал любое количество различных комбинаций: например odata/Продукты/MostExpensive, odata/Продукты/MostExpensive(), odata/Продукты/Default.MostExpensive() (последний, когда я не задал явно пространство имен) –
Спасибо, я также заметил, что нет атрибута типа ответа [ResponseType (typeof (decimal))]. –