我整天都在努力挣扎,我认为我在这方面所看到的所有答案都结束了。也许我很特别,或者我在做一些愚蠢的事情。我最近将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));
}
然后我试图将URL称为http://localhost:60965/odata/froterparties/101或者http://localhost:60965/odata/101
或实际上任何东西。我觉得有某种形式无法激活它。我在控制器'对手'中的操作'getCounterparty'上获得"路径模板'{key}'不是有效的odata路径模板。找不到段'{key}'的资源。"
<</p>您是否尝试将方法重命名为GetCounterParties([FromoDatauri] int key)并删除odataroute属性?
这不是我的问题的100%解决方案,因为我添加了odata作为标签。
将odatacontroller与apicontroller(WebAPI2.2)进行比较,我找不到任何理由不切换到后者。因此,我将控制器更改为继承Apicontroller,然后将ODATA的所有参考转换为WebAPI版本。实际上,上面的代码与上述控制器和OdatarOute现在几乎相同,现在变得简单地"路线"。该代码完全可以编译,并且更易于管理。如果我的操作的返回类型是可及的,我什至可以使用ODATA过滤器。