Совершенно новый для ASP.Net Core, особенно с API.Раньше меня использовали для создания простых API-интерфейсов с использованием контроллера по умолчанию, например:
[Produces("application/json")]
[Route("api/TestCust")]
public class TestCustController : Controller
{
// GET: api/TestCust
[HttpGet]
public IEnumerable<Customer> Get()
{
IEnumerable<Customer> customer = null;
....
return customer;
}
// GET: api/TestCust/5
[HttpGet("{id}", Name = "Get")]
public IEnumerable<Customer> Get(int id)
{
IEnumerable<Customer> customer = null;
return customer;
}
Теперь я сталкиваюсь с новой задачей, поскольку я создаю API, но клиентская сторона уже созданатретья вечеринка.Это означает, что я вынужден сделать это их способом.
К счастью, это хорошо задокументировано, и они предоставляют примеры запросов, которые они будут отправлять в мой API.Один из этих запросов следующий: /Customers?$filter=ID+eq+guid'1D225D75-A587-4AE4-BA9A-2224B2484EA5'
и для того, чтобы привлечь всех клиентов: /Customers?$orderby=Code&$skip=100
Теперь я совершенно новичок в OData, я только что узнал о них вчера и следил занекоторые уроки об этом.Хотя большинство из них используют Entity Framework, а я использую Dapper в сочетании с хранимыми процедурами.
Далее следуют учебники: https://damienbod.com/2018/10/12/odata-with-asp-net-core/, https://dotnetthoughts.net/perform-crud-operations-using-odata-in-aspnet-core/
Итак, я пытался сделать запрос, используя [EnableQuery]
, но это пока не сработало.Я свяжу ошибку внизу.
Итак, что именно я сделал?Ну, я изменил Startup.cs
public void ConfigureServices(IServiceCollection services)
{
...
services.AddOData();
services.AddODataQueryFilter()
services.AddMvc();
services.AddOptions();
}
И внутри моего контроллера клиента:
public class CustomersController : ODataController{
...
[EnableQuery]
public IEnumerable<Customer> Get()
{
IEnumerable<Customer> allCustomers = null;
IEnumerable<Addresses> allAddresses = null;
IEnumerable<Contacts> allContacts = null;
//Execute the procedures to fetch our objects.
using (var connection = new SqlConnection(config.Value.ConnectionString.ToString()))
{
allCustomers = connection.Query<Customer>("someproc");
allAddresses = connection.Query<Addresses>("someproc");
allContacts = connection.Query<Contacts>("someproc");
}
//Loop through our customer object
foreach(var item in allCustomers)
{
//Initialize a collection of address + contact
ICollection<Contacts> CustomerContact = null;
ICollection<Addresses> CustomerAddress = null;
//Bind the Contact and Address to the correct Customer using the CustomerID
//Tijdelijk uitgezet omdat customer nu even geen GUID is..
//CustomerContact = allContacts.Where(x => x.Customer == item.Id).ToList();
//CustomerAddress = allAddresses.Where(x => x.Customer == item.Id).ToList();
item.Contacts = CustomerContact;
item.Addresses = CustomerAddress;
}
return allCustomers;
}
И вот сообщение, которое он возвращаетв браузере / почтальоне как «ошибка 400 неверный запрос»:
Запрос, указанный в URI, недопустим.Не удается найти контейнер служб для маршрута без OData.Это может произойти при использовании компонентов OData на маршруте, отличном от OData, и обычно является проблемой конфигурации.Вызовите EnableDependencyInjection (), чтобы включить компоненты OData на не-OData маршрутах.Это может также произойти, когда запрос был ошибочно обработан слоем маршрутизации ASP.NET Core вместо слоя маршрутизации OData, например, URL-адрес не включает префикс маршрута OData, настроенный посредством вызова MapODataServiceRoute ()
Полное сообщение - https://pastebin.com/QtyuaQv1