Я создаю проект, который будет иметь внешний интерфейс Angular, который взаимодействует с ядром .net Web Api-проекта, используя OData для обеспечения богатых запросов.
Я добавил пакет OData Nuget в свой угловой проект.
Я следовал следующему уроку:
https://devblogs.microsoft.com/odata/simplifying-edm-with-odata/
В моем Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddSpaStaticFiles(configuration =>
{
configuration.RootPath = "ClientApp/dist";
});
/* snipped some code about DbContext and AutoMapper, not relevant */
services.AddMvcCore(action => action.EnableEndpointRouting = false)
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddOData();
services.AddODataQueryFilter();
}
private static IEdmModel GetEdmModel()
{
var builder = new ODataConventionModelBuilder();
builder.EntitySet<Asset>("Assets");
return builder.GetEdmModel();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseStaticFiles();
app.UseSpaStaticFiles();
app.UseMvc(routes =>
{
routes.EnableDependencyInjection();
routes.Select().Filter().OrderBy().Expand().Count().MaxTop(10);
routes.MapODataServiceRoute("api", "api", GetEdmModel());
routes.MapRoute(
name: "default",
template: "{controller}/{action=Index}/{id?}");
});
app.UseSpa(spa =>
{
// To learn more about options for serving an Angular SPA from ASP.NET Core,
// see https://go.microsoft.com/fwlink/?linkid=864501
spa.Options.SourcePath = "ClientApp";
if (env.IsDevelopment())
{
spa.UseAngularCliServer(npmScript: "start");
}
});
}
В моем классе контроллера API (здесь он называется "Активы")
public class AssetsController : ControllerBase
{
public AssetsController(IAssetService _service)
{
this._service = _service;
}
[HttpGet("[action]")]
[EnableQuery()]
public ActionResult<IEnumerable<Asset>> All()
{
var assets = _service.GetAllAssets();
return assets.ToList();
}
}
Задача 1
Если я удалю атрибут ApiController из моего класса Web API Controller, URL http://localhost:xxxx/api/Assets/All просто снова отобразит мой SPA.
[Route("api/[controller]")]
[ApiController]
Задача 2
Если я снова добавлю этот код в свой класс, произойдет следующее:
Звонок http://localhost:xxxx/api/Assets?$count=true
должен вернуть список вроде этого:
{
"@odata.context": "https://localhost:44374/api/$metadata#Assets",
"@odata.count": 2,
"value": [
{
"Id": "9cef40f6-db31-4d4c-997d-8b802156dd4c",
"Name": "Asset 1",
},
{
"Id": "282be5ea-231b-4a59-8250-1247695f16c3",
"Name": "Asset 2",
}
]
}
но вместо этого эта конечная точка возвращает:
[
{
"Id": "9cef40f6-db31-4d4c-997d-8b802156dd4c",
"Name": "Asset 1",
},
{
"Id": "282be5ea-231b-4a59-8250-1247695f16c3",
"Name": "Asset 2",
}
]
У кого-нибудь есть идеи, что происходит или что я делаю неправильно?