Создайте конечную точку API OData, используя объект без ключа - PullRequest
0 голосов
/ 31 октября 2018

У меня есть служба ASP.NET Core API с поддержкой OData v4. Я пытаюсь представить контроллер, основанный на объекте без ключа. OData требует ключ для зарегистрированных объектов, поэтому моя проблема. Вы могли бы рассмотреть это больше как метод действия больше всего на свете.

Эта проблема не должна быть специфичной для ASP.NET Core, но было интересно, если кто-нибудь когда-либо делал это успешно с OData. Я попытался зарегистрировать одно из свойств в модели CheckRequest, но он не смог сказать, что это должно быть навигационное свойство. Я также попытался зарегистрировать его как сложный тип, так как у него не было ключа, но служба затем вернула бы 404 для маршрута.

См. Ниже образцы кода и более подробную информацию. Обратите внимание, что я использую Microsoft.AspNetCore.App 2.1.5, Microsoft.AspNetCore.OData 7.0.1, and Microsoft.AspNetCore.OData.Versioning 3.0.0-beta1. В большинстве случаев настройка OData для нашего приложения основана на примерах онлайн здесь: https://github.com/Microsoft/aspnet-api-versioning/tree/master/samples/aspnetcore/ODataBasicSample

[ApiVersion("1.0")]
[ODataRoutePrefix("checkrequests")]
public class CheckRequestsController : ODataController
{
   [HttpPost]
   [ODataRoute]
   public async Task<IActionResult> CheckAsync([FromBody] CheckRequest request)
   {
      var success = request.Values.Count == 3 && request.OtherValues.Count == 6;
      return this.Ok(await Task.FromResult(new CheckResult { Success = true }));
   }
}

public class CheckRequest
{
   public List<int> Values { get; set; }
   public List<int> OtherValues { get; set; }
}

public class CheckResult
{
   public bool Success { get; set; }
}

public class CheckRequestModelConfiguration : IModelConfiguration
{
   public void Apply(
      ODataModelBuilder builder,
      ApiVersion apiVersion)
   {
      switch (apiVersion.MajorVersion)
      {
         default:
            ConfigureV1(builder);
            break;
      }
   }

   private static void ConfigureV1(ODataModelBuilder builder)
   {
      builder.ComplexType<V1.AccessCheckRequest>();
   }
}

public class Startup
{
   public void ConfigureServices(IServiceCollection services)
   {
      services.AddMvc();
      services.AddApiVersioning();
      services.AddOData().EnableApiVersioning();
   }

   public void Configure(
      IApplicationBuilder app,
      VersionedODataModelBuilder modelBuilder)
   {
      app.UseMvc(routes =>
      {
         routes.MapVersionedODataRoutes("odata-bypath", "v{version:apiVersion}", modelBuilder.GetEdmModels());
      });
   }
}

1 Ответ

0 голосов
/ 31 октября 2018

Итак, покопавшись еще немного, я нашел ответ. OData v4 поддерживает несвязанные функции и действия, которые не имеют привязки к ним, в основном служебные методы.

Дополнительную документацию можно найти здесь: https://odata.github.io/WebApi/#02-03-model-builder-nonconvention в разделе о несвязанных действиях и функциях.

Изменение приведенного выше примера кода, который работает, заключается в изменении только следующего раздела:

public class CheckRequestModelConfiguration : IModelConfiguration
{
   public void Apply(
      ODataModelBuilder builder,
      ApiVersion apiVersion)
   {
      switch (apiVersion.MajorVersion)
      {
         default:
            ConfigureV1(builder);
            break;
      }
   }

   private static void ConfigureV1(ODataModelBuilder builder)
   {
      builder.AddFunction("checkrequests").Returns<CheckResult>();
   }
}
...