【问题标题】:Attribute Routing: "Not a valid ODataPath Template"属性路由:“不是有效的 ODataPath 模板”
【发布时间】:2017-07-30 23:17:49
【问题描述】:

我整天都在为此苦苦挣扎,我想我已经完成了我在这方面看到的所有答案。也许我很特别,或者我在做一些愚蠢的事情。 我最近从 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/Counterparties/101 要么 http://localhost:60965/odata/101

或者在这一点上真的任何东西。我觉得我缺少某种配置来激活它。我收到错误消息“控制器'Counterparty' 中的操作'GetCounterparty' 上的路径模板'{key}' 不是有效的OData 路径模板。找不到段'{key}' 的资源。”

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 是的。那行得通。但我想做的是在控制器内路由。我希望用户能够获得几个不同版本的视图(实体)。所以 api/counterparties 会得到 vanilla 版本,也许 api/counterparties/advanced 会得到那个视图的高级版本。
    【解决方案2】:

    这不是 100% 解决我的问题,因为我添加了 odata 作为标签。

    将 ODataController 与 ApiController (WebAPI2.2) 进行比较,我找不到任何不切换到后者的理由。 所以我将控制器更改为继承 APIController,并将所有 odata 引用切换到 WebAPI 版本。实际上,除了前面提到的控制器和 ODataRoute 现在变成简单的“Route”之外,上面的代码几乎相同。代码编译得很好,并且更易于管理。如果我的操作的返回类型是可查询的,我什至可以使用 odata 过滤器。

    【讨论】:

      猜你喜欢
      • 2018-10-05
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 2018-08-25
      • 2014-04-15
      • 2015-11-03
      • 2020-08-02
      • 2018-03-31
      相关资源
      最近更新 更多