属性路由:"Not a valid ODataPath Template"



我整天都在努力挣扎,我认为我在这方面所看到的所有答案都结束了。也许我很特别,或者我在做一些愚蠢的事情。我最近将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过滤器。

相关内容

最新更新