我有一个具有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());
});
}
}
答案 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>();
}
}