【发布时间】:2014-10-05 18:05:50
【问题描述】:
我正在尝试在 OData v4 Web API 解决方案中创建自定义函数。我需要根据 OData 无法本地处理的独特逻辑返回一组“订单”。我似乎无法弄清楚如何在不破坏整个 OData 服务层的情况下创建这个自定义函数。当我用 ODataRoute 属性装饰 Controller 方法时,一切都会变糟。任何基本请求都会产生相同的错误。有人可以看看下面的代码,看看你是否注意到我必须遗漏的东西?
WebApiConfig.cs
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.MapODataServiceRoute("odata", "odata", model: GetModel());
}
public static Microsoft.OData.Edm.IEdmModel GetModel()
{
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Account>("Accounts");
builder.EntitySet<Email>("Emails");
builder.EntitySet<PhoneNumber>("PhoneNumbers");
builder.EntitySet<Account>("Accounts");
builder.EntitySet<Address>("Addresses");
builder.EntitySet<Order>("Orders");
builder.EntitySet<OrderDetail>("OrderDetails");
var orders = builder.EntityType<Order>();
var function = orders.Function("GetByExternalKey");
function.Parameter<long>("key");
function.ReturnsCollectionFromEntitySet<Order>("Orders");
return builder.GetEdmModel();
}
}
OrdersController.cs
public class OrdersController : ODataController
{
private SomeContext db = new SomeContext();
...Other Stuff...
[HttpGet]
[ODataRoute("GetByExternalKey(key={key})")]
public IHttpActionResult GetByExternalKey(long key)
{
return Ok(from o in db.Orders
where //SpecialCrazyStuff is done
select o);
}
}
}
向 OData 层发出任何请求时,我收到以下错误响应。
控制器“订单”中操作“GetByExternalKey”的路径模板“GetByExternalKey(key={key})”不是有效的 OData 路径模板。未找到段“GetByExternalKey”的资源。
【问题讨论】:
-
我遇到了类似的问题。添加自定义功能时,我收到了同样的错误。我能够使用自定义功能启动一个干净的项目并且它工作正常,但是在向组合中添加一个额外的控制器后,我会收到上述错误。在这里找到解决方案和解释:Adding a new OData controller fails existing controller
标签: c# asp.net-web-api odata asp.net-web-api-odata