Ich habe ein .NET 6 -Web -API -Projekt mit ODATA und den ASP.Versioning -Paketen geerbt. Die Versionungsfunktionalität war nicht 100% korrekt, und jetzt, da das Projekt für eine regelmäßigere Nutzung erforderlich ist, möchte ich die Versionierung korrekt implementieren. < /p>
Attributrouten mit demselben Namen 'Odata /v {Version: apiversion} /parts' muss die gleiche Vorlage haben:
Aktion: '... v2.Controllers.PartScontroller.get' - Vorlage: 'odata/v {Version: apiversion}/part/odata/v {Version: apiversion}/part'
Aktion: '... v2. Controller.PartsController.get ' - Vorlage:' Odata/V {Version: apiversion}/part '
Aktion: '... v1.controllers.partscontroller.get' - Vorlage: 'Odata/V {Version: apiversion}/part'
Aktion: '... v1.controllers.PartScontroller.get' - Vorlage: 'Odata /v {Version: apiversion}/part wie: < /p>
namespace ...Api.Versions.v1.Controllers
{
[ApiController]
[ApiExplorerSettings(GroupName = "v1")]
[ApiVersion("1")]
[Route("odata/v{version:apiVersion}/[controller]")]
public class PartsController : ODataController
{
[Produces("application/json")]
[EnableQuery]
[HttpGet]
public async Task Get()
{
...
}
}
}
< /code>
und < /p>
namespace ...Api.Versions.v2.Controllers
{
[ApiController]
[ApiExplorerSettings(GroupName = "v2")]
[ApiVersion("2")]
[Route("odata/v{version:apiVersion}/[controller]")]
public class PartsController : ODataController
{
[Produces("application/json")]
[EnableQuery]
[HttpGet]
public async Task Get()
{
...
}
}
}
< /code>
Mein Startup.cs hat die folgende Konfiguration: < /p>
public void ConfigureServices(IServiceCollection services)
{
...
services.AddControllers()
.AddOData(options =>
{
options.EnableQueryFeatures(maxTopValue: 8000);
options.TimeZone = TimeZoneInfo.Utc;
});
services.AddApiVersioning(options =>
{
options.AssumeDefaultVersionWhenUnspecified = true;
options.DefaultApiVersion = new ApiVersion(1);
options.ReportApiVersions = true;
options.ApiVersionReader = new UrlSegmentApiVersionReader();
})
.AddMvc()
.AddOData(options =>
{
options.AddRouteComponents("odata/v{version:apiVersion}");
})
.AddODataApiExplorer(options =>
{
options.GroupNameFormat = "'v'V";
options.SubstituteApiVersionInUrl = true;
});
...
}
public void Configure(IApplicationBuilder app)
{
...
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
...
}
< /code>
und meine EDM -Konfiguration lautet wie folgt: < /p>
namespace ...Api.Utilities.ModelConfiguration
{
using Asp.Versioning;
using Asp.Versioning.OData;
using Microsoft.OData.ModelBuilder;
public class PartModelConfiguration : IModelConfiguration
{
public void Apply(ODataModelBuilder builder, ApiVersion apiVersion, string routePrefix)
{
switch (apiVersion.MajorVersion)
{
case 1:
ConfigureV1(builder);
break;
case 2:
ConfigureV2(builder);
break;
default:
ConfigureCurrent(builder);
break;
}
}
private void ConfigureV1(ODataModelBuilder builder) =>
ConfigureCurrent(builder);
private void ConfigureV2(ODataModelBuilder builder) =>
ConfigureCurrent(builder);
private EntityTypeConfiguration ConfigureCurrent(ODataModelBuilder builder)
{
var part = builder.EntitySet("Parts").EntityType;
part.HasKey(p => p.IdPart);
return part;
}
}
}
< /code>
Im Moment gibt es keinen Unterschied zwischen Modellen für V1 und V2. Dies dient nur zur Testfunktionalität. < /p>
Ich vertraue darauf, dass die obige Konfiguration wird nach dem letzten Abschnitt dieser Seite automatisch für DI registriert: https://github.com/dotnet/aspnet-api-ve ... igurations
Ich habe das Gefühl, dass es ein kleines Stück Konfiguration gibt, das ich verpasst habe, aber ich habe Probleme, herauszufinden, was das sein könnte. < /p>
Odata -Routing verursacht Ausnahme mit versionierten API -Endpunkten ⇐ C#
-
- Similar Topics
- Replies
- Views
- Last post