我整天都在苦苦挣扎,我想我已经看到了所有答案的结尾。也许我特别,或者也许我正在做一些愚蠢的事情。 我最近从V3升级到V4(我认为)。我使用System.Web.OData命名空间应该没问题。
这是我的WebAPIConfig
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using System.Web.OData.Builder;
using System.Web.OData.Extensions;
using System.Web.OData.Routing;
using System.Web.OData.Routing.Conventions;
using GizmoAPI.Models;
namespace GizmoAPI
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Counterparty>("Counterparties");
config.Select().Expand().Filter().OrderBy().MaxTop(null).Count();
config.EnableDependencyInjection();
config.MapHttpAttributeRoutes();
config.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());
config.AddODataQueryFilter();
var cors = new System.Web.Http.Cors.EnableCorsAttribute("http://localhost:56248", "*", "*");
config.EnableCors( cors);
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/html"));
config.EnableSystemDiagnosticsTracing();
}
}
}
这是一个基本的控制器:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.ModelBinding;
using System.Web.OData;
using System.Web.OData.Routing;
using GizmoAPI.Models;
namespace GizmoAPI.Controllers
{
public class CounterpartiesController : ODataController
{
private GizmoEntities db = new GizmoEntities();
// GET odata/Counterparties
[EnableQuery]
public IQueryable<Counterparty> GetCounterparties()
{
return db.Counterparties;
}
// GET odata/Counterparties(5)
[EnableQuery]
[ODataRoute("{key}")]
public SingleResult<Counterparty> GetCounterparty([FromODataUri] int key)
{
return SingleResult.Create(db.Counterparties.Where(counterparty => counterparty.CounterpartyID == key));
}
然后我尝试将网址称为http://localhost:60965/odata/Counterparties/101 要么 http://localhost:60965/odata/101
或者此时的任何事情。我觉得有一些配置,我很想激活它。我在控制器'Counterparties'中的'GetCounterparty'操作中得到错误“路径模板'{key}'不是有效的OData路径模板。找不到段”{key}“的资源。”
答案 0 :(得分:0)
您是否尝试将方法重命名为GetCounterParties([FromODataUri] int key) 并删除OdataRoute属性?
答案 1 :(得分:0)
这不是100%修复我的问题,因为我添加了odata作为标记。
比较ODataController和ApiController(WebAPI2.2),我找不到任何理由不切换到后者。 所以我改变了我的控制器继承APIController,并将odata的所有引用切换为WebAPI版本。事实上,上述代码几乎完全相同,除了前面提到的控制器和ODataRoute现在变成简单的“路由”。代码编译完全正确,更易于管理。如果我的动作的返回类型是可以查询的,我甚至可以使用odata过滤器。