Может ли odata и не odata маршруты существовать - PullRequest
0 голосов
/ 22 февраля 2020

Я использую asp. net core 3.x, и я установил. net Nuget odata ядра.

в моем разделе услуг у меня есть настройки 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 / аккаунты одновременно?

 //[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());
    }
}

1 Ответ

0 голосов
/ 24 февраля 2020

Одата может столкнуться с ошибками при использовании $select из. net core 3.x с использованием System.Text.Json сериализатора. Так что в вашем сценарии вы можете использовать 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 вернут данные.

...