Объединение OData и .NET API для приложения Angular SPA - PullRequest
0 голосов
/ 05 июня 2019

Я создаю проект, который будет иметь внешний интерфейс 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",
    }
]

У кого-нибудь есть идеи, что происходит или что я делаю неправильно?

1 Ответ

0 голосов
/ 05 июня 2019

Попробуйте удалить эту строку:

routes.EnableDependencyInjection();
...