使用没有密钥的实体创建OData API端点

时间:2018-10-31 06:17:33

标签: c# asp.net asp.net-core odata asp.net-core-webapi

我有一个具有OData v4支持的ASP.NET Core API服务。我试图介绍一种基于没有密钥的实体的控制器。 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 :(得分:0)

因此,在深入研究之后,我找到了答案。 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>();
   }
}