首页 > 解决方案 > 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());
    }
}

标签: asp.net-coreodata

解决方案


$select从 .net core 3.x 使用System.Text.Jsonserializer时, 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 。


推荐阅读