问:使用 odata v4.0 的 c# webapi 核心 2.0 路由?
Q: c# webapi core 2.0 routing with odata v4.0?
目前我使用 webapi 和 odata 并想创建一个小的测试项目。路由映射当前无法正常工作。
我使用以下库:
- Microsoft.AspNetCore.All (2.0.3)
- Microsoft.AspNetCore.Odata (7.0.0-beta1)
- 带有 core2.0
的最新 webapi
配置部分:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//Adding Model class to OData
var builder = new ODataConventionModelBuilder(app.ApplicationServices);
builder.EntitySet<Person>($"{nameof(Person)}s");
//app.
//app.UseMvcWithDefaultRoute();
app.UseMvc(routebuilder =>
{
routebuilder.EnableDependencyInjection();
routebuilder.Filter().Expand().Select().OrderBy().MaxTop(null).Count();
routebuilder.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());
});
}
控制器部分:
public class PersonsController : ODataController
{
private static readonly List<Person> myPersons = new List<Person>
{
new Person {Firstname = "Person1", Lastname= "Test", Id = "p1"},
new Person {Firstname = "Person2", Lastname= "Test", Id = "p2"},
new Person {Firstname= "Person3", Lastname= "Test", Id = "p3"},
new Person {Firstname= "Person4", Lastname= "Test", Id = "p4"},
};
public IQueryable<Person> GetPersons()
{
return myPersons.AsQueryable();
}
public Person GetPerson([FromODataUri] string key)
{
return myPersons.FirstOrDefault(x => x.Id == key);
}
}
模型部分:
public class Person
{
[Key]
public string Id { get; set; }
public string Firstname{ get; set; }
public string Lastname { get; set; }
}
在 the odata documentation 中,这些调用现在应该可以工作了:
- ~/odata/Persons
- ~/odata/Persons('p1')
但事实并非如此。我总是从 IIS 得到一个找不到页面的结果。我认为 MapODataServiceRoute 调用没有正确设置路由。 È 不要在 webapi 中使用任何默认路由。有什么想法吗?
我尝试了几种方法并找到了解决问题的方法。
配置方法中的顺序很重要:
这是有效的:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddOData();
}
这不是:
public void ConfigureServices(IServiceCollection services)
{
services.AddOData();
services.AddMvc();
}
目前我使用 webapi 和 odata 并想创建一个小的测试项目。路由映射当前无法正常工作。
我使用以下库: - Microsoft.AspNetCore.All (2.0.3) - Microsoft.AspNetCore.Odata (7.0.0-beta1) - 带有 core2.0
的最新 webapi配置部分:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//Adding Model class to OData
var builder = new ODataConventionModelBuilder(app.ApplicationServices);
builder.EntitySet<Person>($"{nameof(Person)}s");
//app.
//app.UseMvcWithDefaultRoute();
app.UseMvc(routebuilder =>
{
routebuilder.EnableDependencyInjection();
routebuilder.Filter().Expand().Select().OrderBy().MaxTop(null).Count();
routebuilder.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());
});
}
控制器部分:
public class PersonsController : ODataController
{
private static readonly List<Person> myPersons = new List<Person>
{
new Person {Firstname = "Person1", Lastname= "Test", Id = "p1"},
new Person {Firstname = "Person2", Lastname= "Test", Id = "p2"},
new Person {Firstname= "Person3", Lastname= "Test", Id = "p3"},
new Person {Firstname= "Person4", Lastname= "Test", Id = "p4"},
};
public IQueryable<Person> GetPersons()
{
return myPersons.AsQueryable();
}
public Person GetPerson([FromODataUri] string key)
{
return myPersons.FirstOrDefault(x => x.Id == key);
}
}
模型部分:
public class Person
{
[Key]
public string Id { get; set; }
public string Firstname{ get; set; }
public string Lastname { get; set; }
}
在 the odata documentation 中,这些调用现在应该可以工作了:
- ~/odata/Persons
- ~/odata/Persons('p1')
但事实并非如此。我总是从 IIS 得到一个找不到页面的结果。我认为 MapODataServiceRoute 调用没有正确设置路由。 È 不要在 webapi 中使用任何默认路由。有什么想法吗?
我尝试了几种方法并找到了解决问题的方法。 配置方法中的顺序很重要:
这是有效的:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddOData();
}
这不是:
public void ConfigureServices(IServiceCollection services)
{
services.AddOData();
services.AddMvc();
}