Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 属性路由:";不是有效的ODataPath模板";_C#_C# 4.0_Asp.net Web Api2_Odata - Fatal编程技术网

C# 属性路由:";不是有效的ODataPath模板";

C# 属性路由:";不是有效的ODataPath模板";,c#,c#-4.0,asp.net-web-api2,odata,C#,C# 4.0,Asp.net Web Api2,Odata,我一整天都在努力解决这个问题,我想我已经找到了所有关于这个问题的答案。也许我很特别,也许我在做一些愚蠢的事情。 我最近从V3升级到V4(我想)。我使用System.Web.OData名称空间,这应该可以 这是我的网页 using System; using System.Collections.Generic; using System.Linq; using System.Web.Http; using System.Web.OData.Builder; using System.Web.OD

我一整天都在努力解决这个问题,我想我已经找到了所有关于这个问题的答案。也许我很特别,也许我在做一些愚蠢的事情。 我最近从V3升级到V4(我想)。我使用System.Web.OData名称空间,这应该可以

这是我的网页

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();
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web.Http;
使用System.Web.OData.Builder;
使用System.Web.OData.Extensions;
使用System.Web.OData.Routing;
使用System.Web.OData.Routing.Conventions;
使用GizmoAPI.Models;
名称空间GizmoAPI
{
公共静态类WebApiConfig
{
公共静态无效寄存器(HttpConfiguration配置)
{
config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“api/{controller}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);
ODataModelBuilder=新ODataConventionModelBuilder();
建造商实体集(“交易对手”);
config.Select().Expand().Filter().OrderBy().MaxTop(null.Count());
config.EnableDependencyInjection();
config.maphttpAttribute路由();
config.MapODataServiceRoute(“odata”,“odata”,builder.GetEdmModel());
config.AddODataQueryFilter();
var cors=new System.Web.Http.cors.EnableCorsAttribute(“http://localhost:56248", "*", "*");
配置使能cors(cors);
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(新的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));
    }
使用系统;
使用System.Collections.Generic;
使用系统数据;
使用System.Data.Entity;
使用System.Data.Entity.Infrastructure;
使用System.Linq;
Net系统;
使用System.Net.Http;
使用System.Web.Http;
使用System.Web.Http.ModelBinding;
使用System.Web.OData;
使用System.Web.OData.Routing;
使用GizmoAPI.Models;
命名空间GizmoAPI.Controllers
{
公共类交易对手控制器:ODataController
{
私有GizmoEntities db=新GizmoEntities();
//获取odata/交易对手
[启用查询]
公共可查询交易对手()
{
返回db.交易对手;
}
//获取odata/交易对手(5)
[启用查询]
[ODataRoute(“{key}”)]
公共单结果获取交易对手([FromODataUri]int-key)
{
返回SingleResult.Create(db.Counterparties.Where(counterparty=>counterparty.CounterpartyID==key));
}
然后我尝试调用URL作为 或


或者在这一点上真的是什么。我觉得我缺少某种配置来激活它。我得到错误“控制器“对手”中操作“getcounterparties”上的路径模板“{key}”不是有效的OData路径模板。找不到段“{key}”的资源。”

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

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

比较ODataController和ApicController(WebAPI2.2),我找不到任何不切换到后者的理由。
因此,我将控制器更改为继承APIController,并将odata的所有引用切换到WebAPI版本。事实上,上面的代码与前面提到的控制器几乎相同,ODataRoute现在变成了简单的“路由”。代码编译得非常好,而且更易于管理。如果我的操作的返回类型是iqueryable,我甚至可以使用odata筛选器。

是的。这很有效。但我要做的是在控制器内路由。我有两个不同版本的视图(实体)我希望用户能够获得。因此api/交易对手将获得普通版本,也许api/交易对手/高级将获得该视图的高级版本。