API .NetCore 3.1 с проблемами при использовании Asp .NetCore.Odata для REST API - PullRequest
0 голосов
/ 18 февраля 2020

Главное, что я хочу сделать - я хочу, чтобы мой As pNet .Core 3.1 API поддерживал Odata. Главное, что WebApi предоставляет объект Dto, который внутренне отображается на объект сущности. Я внес изменения, однако получаю ошибку 404. Я сделал следующие изменения:

  • Установите AspNetCore.OData 7.3.

  • Добавлены изменения в Startup.cs

publi c class Startup {publi c void Службы ConfigureServices (IServiceCollection) services.AddOData (); services.Add Mvc (options => options.EnableEndpointRouting = false);

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
   IEdmModel model = GetEdmModel();
   app.UseMvc(builder =>
   {
            builder.Select().Expand().Filter().OrderBy().MaxTop(100).Count();
            builder.MapODataServiceRoute("odata", "odata", model);
   });

public static IEdmModel GetEdmModel()
    {
        if (_edmModel == null)
        {
            var builder = new ODataConventionModelBuilder();
            builder.EntitySet<CustomerDto>("CustomerDtos");                
            _edmModel = builder.GetEdmModel();
        }
        return _edmModel;
    }

} - Изменения CustomersController

public class CustomersController : ControllerBase 
{
    public ICustomerRepository _customers;
    public CustomersController(DbContext context)/
    {
        _customers = new CustomerRepository(context);
    }

    [HttpGet]        
    [EnableQuery]
    public async Task<ActionResult<IEnumerable<CustomerDto>>> Get()
    {
        return Ok((await _customers.GetCustomers()).Select(c=>CustomerDto.MapToCustomerDto(c)));
    }
}

Однако это постоянно приводит к 404 ошибкам / данным * клиентов

1 Ответ

1 голос
/ 19 февраля 2020

Если вы используете url /odata/customers, customers относится к набору сущностей с именем Customers. Имя контроллера всегда получено из сущности, установленной в root пути OData.

См. https://docs.microsoft.com/en-us/odata/webapi/built-in-routing-conventions#built -in-routing-конвенцииtions-1

Решения :

Одним из способов является сохранение имени EntitySet, но изменение имени контроллера

(CustomersController-> CustomerDtosController):

public class CustomerDtosController : ControllerBase

Url: /odata/customerDtos

Другой способ - сохранить имя контроллера, но изменить EntitySet name:

builder.EntitySet<CustomerDto>("Customers");

Url: odata/customers

...