我使用的是asp.net核心3.x,并且我已经安装了.net核心的odata nuget。
在我的服务部分,我像这样设置了odata
services.AddOData();
services.AddODataQueryFilter();
services.AddMvc(options =>
{
options.EnableEndpointRouting = false;
});
配置如下所示。
app.UseMvc(b =>
{
b.MapODataServiceRoute("odata", "odata", GetEdmModel());
});
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
当我使用/ odata /Accounts时,我会得到odata响应,是否可以同时获取/api/Accounts?
//[ODataRoutePrefix("Account")]
[Route("api/[controller]")]
[ApiController]
public class AccountsController : ControllerBase
{
private readonly IAccountService _accountService;
public AccountsController(IAccountService accountService)
{
_accountService = accountService;
}
[ODataRoute]
[EnableQuery(PageSize = 2, AllowedQueryOptions = AllowedQueryOptions.All)]
[HttpGet]
public async Task<ActionResult<IEnumerable<Account>>> Get()
{
return Ok(await _accountService.GetAllAccounts());
}
}
发布于 2020-02-24 15:16:47
使用.net core 3.x中的System.Text.Json
序列化程序时,Odata可能会遇到错误。以便在您场景中可以使用AddNewtonsoftJson
作为变通方法。注意:如果AddNewtonsoftJson
方法不可用,请确保安装了Microsoft.AspNetCore.Mvc.NewtonsoftJson
包。下面的代码示例供您参考:
Student.cs:
public class Student
{
public Guid Id { get; set; }
public string Name { get; set; }
public int Score { get; set; }
}
StudentsController.cs:
[Route("api/[controller]")]
[ApiController]
public class StudentsController : ControllerBase
{
[HttpGet]
[EnableQuery()]
public IEnumerable<Student> Get()
{
return new List<Student>
{
CreateNewStudent("Cody Allen", 130),
CreateNewStudent("Todd Ostermeier", 160),
CreateNewStudent("Viral Pandya", 140)
};
}
private static Student CreateNewStudent(string name, int score)
{
return new Student
{
Id = Guid.NewGuid(),
Name = name,
Score = score
};
}
}
ConfigureServices:
services.AddControllers(mvcOptions =>
mvcOptions.EnableEndpointRouting = false)
.AddNewtonsoftJson();
services.AddOData();
services.AddODataQueryFilter();
配置:
app.UseMvc(b =>
{
b.Select().Filter();
b.MapODataServiceRoute("odata", "odata", GetEdmModel());
b.EnableDependencyInjection(); //add this line
});
GetEdmModel:
IEdmModel GetEdmModel()
{
var odataBuilder = new ODataConventionModelBuilder();
odataBuilder.EntitySet<Student>("Students");
return odataBuilder.GetEdmModel();
}
这样https://localhost:44334/odata/students?$select=name
和https://localhost:44334/api/students?$select=name
都会返回数据。
https://stackoverflow.com/questions/60348515
复制相似问题