Asp.net web api Can';无法正确配置Odata服务

Asp.net web api Can';无法正确配置Odata服务,asp.net-web-api,odata,Asp.net Web Api,Odata,我似乎无法正确配置控制器和映射。如果我恢复到标准的ApiController和默认映射,我可以正常连接,但不能使用EntityController类型和OData映射进行连接。在尝试引用localhost:port/odata/persons我的代码时,服务器返回了一个406错误 (PS-我所有的引用和绑定似乎都配置正确…没有任何类型的错误。) 公共静态类WebApiConfig { 公共静态无效寄存器(HttpConfiguration配置) { config.Routes.MapHttpRo

我似乎无法正确配置控制器和映射。如果我恢复到标准的ApiController和默认映射,我可以正常连接,但不能使用EntityController类型和OData映射进行连接。在尝试引用localhost:port/odata/persons我的代码时,服务器返回了一个406错误

(PS-我所有的引用和绑定似乎都配置正确…没有任何类型的错误。)

公共静态类WebApiConfig
{
公共静态无效寄存器(HttpConfiguration配置)
{
config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“api/{controller}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);
//创建实体数据模型
ODataModelBuilder modelBuilder=新ODataConventionModelBuilder();
modelBuilder.EntitySet(“人员”);
//配置端点
Microsoft.Data.Edm.IEdmModel model=modelBuilder.GetEdmModel();
config.Routes.MapODataRoute(“ODataRoute”,“odata”,model);
}
}
公共类PersonsController:EntitySetController
{
静态IList_peeps=新列表()
{
newperson(){ID=1,FirstName=“Ringo”,LastName=“Starr”,BirthDate=newdatetime(1940,7,7)},
newperson(){ID=2,FirstName=“John”,LastName=“Lennon”,BirthDate=newdatetime(1940,10,9)},
newperson(){ID=3,FirstName=“Paul”,LastName=“McCartney”,BirthDate=newdatetime(1942,6,18)},
newperson(){ID=4,FirstName=“George”,LastName=“Harrison”,BirthDate=newdatetime(1943,2,25)},
};
//获取api/人
[可查询]
公共覆盖IQueryable Get()
{
return_peeps.AsQueryable();
}
//获取api/人/5
受保护的覆盖人员GetEntityByKey(int id)
{
返回_peeps.FirstOrDefault(p=>p.ID==ID);
}
}

这是一个非常简单的场景,应该可以工作


您还需要使用
localhost:port/odata/Persons
(Persons而不是Persons)。OData URI区分大小写。

外壳是问题所在。谢谢如果你能告诉我为什么路由区分大小写,我会给你双倍的分数。OData规范要求实体集名称区分大小写。真不幸。我认为有一个工作项可以为未来版本的Web API启用不区分大小写的OData路由。。。无论如何,这里有一个解决办法。虽然很明显,加入每一个排列都会让人非常恼火。我相信重写某个类是一个更好的方法,但现在这是一个快速而肮脏的方法。。。modelBuilder.EntitySet(“人员”);modelBuilder.EntitySet(“人员”);
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        //Create Entity Data Model
        ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
        modelBuilder.EntitySet<Person>("Persons");

        //Configure Endpoint
        Microsoft.Data.Edm.IEdmModel model = modelBuilder.GetEdmModel();
        config.Routes.MapODataRoute("ODataRoute", "odata", model);
    }
}


 public class PersonsController : EntitySetController<Person, int>
{
    static IList<Person> _peeps = new List<Person>()
    {
        new Person() {ID = 1, FirstName = "Ringo", LastName = "Starr", BirthDate = new DateTime(1940, 7, 7)},
        new Person() {ID = 2, FirstName = "John", LastName = "Lennon", BirthDate = new DateTime(1940, 10, 9)},
        new Person() {ID = 3, FirstName = "Paul", LastName = "McCartney", BirthDate = new DateTime(1942, 6, 18)},
        new Person() {ID = 4, FirstName = "George", LastName = "Harrison", BirthDate = new DateTime(1943, 2, 25)},
    };

    // GET api/person
    [Queryable]
    public override IQueryable<Person> Get()
    {
        return _peeps.AsQueryable();
    }

    // GET api/person/5
    protected override Person GetEntityByKey(int id)
    {
        return _peeps.FirstOrDefault(p => p.ID == id);
    }
}