У меня есть служба 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());
});
}
}