属性路由:“不是有效的ODataPath模板”

时间:2017-03-09 19:58:53

标签: c# c#-4.0 asp.net-web-api2 odata

我整天都在苦苦挣扎,我想我已经看到了所有答案的结尾。也许我特别,或者也许我正在做一些愚蠢的事情。 我最近从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}“的资源。”

2 个答案:

答案 0 :(得分:0)

您是否尝试将方法重命名为GetCounterParties([FromODataUri] int key) 并删除OdataRoute属性?

答案 1 :(得分:0)

这不是100%修复我的问题,因为我添加了odata作为标记。

比较ODataController和ApiController(WebAPI2.2),我找不到任何理由不切换到后者。 所以我改变了我的控制器继承APIController,并将odata的所有引用切换为WebAPI版本。事实上,上述代码几乎完全相同,除了前面提到的控制器和ODataRoute现在变成简单的“路由”。代码编译完全正确,更易于管理。如果我的动作的返回类型是可以查询的,我甚至可以使用odata过滤器。