asp.net-core - odata 和非 odata 路由能否共同存在
问题描述
我正在使用 asp.net core 3.x,并且我已经安装了 .net core 的 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());
}
}
解决方案
$select
从 .net core 3.x 使用System.Text.Json
serializer时, Odata 可能会遇到错误。因此,在您的场景中,您可以将AddNewtonsoftJson
其用作解决方法。注意:如果该AddNewtonsoftJson
方法不可用,请确保您已安装该Microsoft.AspNetCore.Mvc.NewtonsoftJson
软件包。下面的代码示例供您参考:
学生.cs:
public class Student
{
public Guid Id { get; set; }
public string Name { get; set; }
public int Score { get; set; }
}
学生控制器.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
};
}
}
配置服务:
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
});
获取EdmModel:
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
返回 data 。
推荐阅读
- php - 如何从另一个表中获取保存的记录
- go - 为什么在循环中分配数组条目更慢?
- python - Unexpected keyword argument 'ragged' in Keras
- java - 如何在 Android 应用程序的两个模块之间传递变量(本地语言)?
- python - 尝试使用 opencv 的 fillPolly 将多边形添加到图像上时出错
- google-cloud-platform - Cloud Pub/Sub 上未确认的消息
- c++ - VB.NET DLL中的C++ DLL函数复制
- reactjs - 将主组件状态传递给另一个组件错误
- outlook - 在 Outlook 中按“发送”按钮后如何添加通知窗口?
- spring-boot - 如何在 groovy 中使用 Spring 表达式语言(SpEL)?(每个春季调度程序crontab)