Я унаследовал проект Web API .NET 6, использующий ODATA и пакеты ASP.Versioning. Функциональность выпуска версий не была на 100% правильной, и теперь, когда проект необходим для более регулярного использования, я хочу правильно реализовать обозначение версий. < /p>
маршруты атрибутов с тем же именем 'odata /v {версия: apiversion} /parts' должен иметь одинаковый шаблон:
action: '... v2.controllers.partscontroller.get' - шаблон: 'odata/v {версия: apiversion}/parts/odata/v {версия: apiversion}/parts'
action: '... v2. Controllers.partscontroller.get ' - Template:' Odata/V {версия: Apiversion}/Parts '
action: '... v1.controllers.partscontroller.get' - Template: 'Odata/V {версия: Apiversion}/Parts'
action: '... v1.controllers.partscontroller.get' - template: 'Odata /v {версия: apiversion}/parts '
Мои контроллеры смотрят Как: < /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>
и < /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>
my startup.cs имеет следующую конфигурацию: < /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>
и моя конфигурация EDM выглядит следующим образом: < /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>
Прямо сейчас нет никакой разницы между моделями для V1 и V2, это только для проверки функциональности. < /p>
Я верю, что вышеупомянутая конфигурация автоматически зарегистрирован для DI в соответствии с последним разделом на этой странице: https://github.com/dotnet/aspnet-api-ve ... igurations
написано /> Я чувствую, что есть какой -то маленький кусочек конфигурации, который я пропустил, но изо всех сил пытаюсь найти, что это может быть. < /p>
Подробнее здесь: https://stackoverflow.com/questions/794 ... -endpoints
Маршрутизация ODATA вызывает исключение с версионными конечными точками API ⇐ C#
Место общения программистов C#
1740041585
Anonymous
Я унаследовал проект Web API .NET 6, использующий ODATA и пакеты ASP.Versioning. Функциональность выпуска версий не была на 100% правильной, и теперь, когда проект необходим для более регулярного использования, я хочу правильно реализовать обозначение версий. < /p>
маршруты атрибутов с тем же именем 'odata /v {версия: apiversion} /parts' должен иметь одинаковый шаблон:
action: '... v2.controllers.partscontroller.get' - шаблон: 'odata/v {версия: apiversion}/parts/odata/v {версия: apiversion}/parts'
action: '... v2. Controllers.partscontroller.get ' - Template:' Odata/V {версия: Apiversion}/Parts '
action: '... v1.controllers.partscontroller.get' - Template: 'Odata/V {версия: Apiversion}/Parts'
action: '... v1.controllers.partscontroller.get' - template: 'Odata /v {версия: apiversion}/parts '
Мои контроллеры смотрят Как: < /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>
и < /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>
my startup.cs имеет следующую конфигурацию: < /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>
и моя конфигурация EDM выглядит следующим образом: < /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>
Прямо сейчас нет никакой разницы между моделями для V1 и V2, это только для проверки функциональности. < /p>
Я верю, что вышеупомянутая конфигурация автоматически зарегистрирован для DI в соответствии с последним разделом на этой странице: https://github.com/dotnet/aspnet-api-versioning/wiki/odata-model-configurations
написано /> Я чувствую, что есть какой -то маленький кусочек конфигурации, который я пропустил, но изо всех сил пытаюсь найти, что это может быть. < /p>
Подробнее здесь: [url]https://stackoverflow.com/questions/79450676/odata-routing-causing-exception-with-versioned-api-endpoints[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия