Проблема с развертыванием API Azure — ошибка Swashbuckle SwaggenGen

У меня возникла проблема при попытке развернуть мою службу приложений в Azure из VS 2022. Каждый раз, когда я получаю эту ошибку:

Проблема с развертыванием API Azure — ошибка Swashbuckle SwaggenGen

Я использую .NET 6 в качестве целевой платформы, и у меня есть пакет Swashbuckle.AspNetCore, обновленный до последней версии. Служба приложения публикуется успешно, но при попытке обновить API появляется ошибка.

В моей версии проекта нет Startup.cs, но есть Program.cs, и я реализую генерацию Swagger следующим образом:

builder.Services.AddSwaggerGen();
var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI();

Я просмотрел похожие сообщения и, основываясь на них, могу добавить, что я также не извлекаю никаких переменных среды.

Я также пытался использовать UseSwaggerUI() таким образом, но все равно получаю ту же ошибку:

app.UseSwaggerUI(options =>
{
    options.SwaggerEndpoint("/swagger/v1/swagger.json", "v1");
    options.RoutePrefix = string.Empty;
});

Странно то, что развертывание работает для моего коллеги, и оно работало для меня до прошлой недели, когда оно остановилось, когда ничего в Program.cs не было изменено по пути.

Моя программа.cs:

var builder = WebApplication.CreateBuilder(args);
var azureKeyVaultUrl = builder.Configuration[AppConfigurationConst.AzureKeyVaultUrl];
var logAnalyticsWorkspaceId = AzureKeyVaultHelper.GetAzureKeyVault(azureKeyVaultUrl, AppConfigurationConst.LogAnalyticsWorkspaceId);
var logAnaliticsAuthenticationId = AzureKeyVaultHelper.GetAzureKeyVault(azureKeyVaultUrl, AppConfigurationConst.LogAnaliticsAuthenticationId);
var CrmConnectionString = AzureKeyVaultHelper.GetAzureKeyVault(azureKeyVaultUrl, AppConfigurationConst.OneCrmConnectionString);

var logger = new LoggerConfiguration()
               .WriteTo.AzureAnalytics(logAnalyticsWorkspaceId, logAnaliticsAuthenticationId)
               .Enrich.FromLogContext()
               .CreateLogger();

var serviceClient = new ServiceClient(CrmConnectionString);


builder.Logging.AddSerilog(logger);

logger.Information("Start ALGOI App Service");

builder.Services.AddControllers().AddNewtonsoftJson();

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

builder.Services.AddSingleton<IAuthenticationService, AuthenticationService>();
builder.Services.AddSingleton<IWebClientService, WebClientService>();

builder.Services.AddScoped<ICreateSessionService, CreateSessionService>();
builder.Services.AddScoped<ICreateFolderService, CreateFolderService>();
builder.Services.AddScoped<IDeleteFolderService, DeleteFolderService>();

builder.Services.AddScoped<IVerifyFolderService, VerifyFolderService>();
builder.Services.AddScoped<IUndoFolderService, UndoFolderService>();

builder.Services.AddSingleton(serviceClient);
builder.Services.AddApplicationInsightsTelemetry(builder.Configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"]);

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();


app.Run();

И мой .csproj:

<Project Sdk = "Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UserSecretsId>{usersecretsid}</UserSecretsId>
    <GenerateRuntimeConfigurationFiles>True</GenerateRuntimeConfigurationFiles>
  </PropertyGroup>

  <ItemGroup>
    <Compile Remove = "Connected Services\**" />
    <Content Remove = "Connected Services\**" />
    <EmbeddedResource Remove = "Connected Services\**" />
    <None Remove = "Connected Services\**" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include = "FluentAssertions" Version = "6.7.0" />
    <PackageReference Include = "JsonSubTypes" Version = "1.9.0" />
    <PackageReference Include = "Microsoft.ApplicationInsights.AspNetCore" Version = "2.15.0" />
    <PackageReference Include = "Microsoft.AspNetCore.Authentication.JwtBearer" Version = "6.0.6" />
    <PackageReference Include = "Microsoft.AspNetCore.Authentication.OpenIdConnect" Version = "6.0.6" />
    <PackageReference Include = "Microsoft.AspNetCore.Mvc" Version = "2.2.0" />
    <PackageReference Include = "Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version = "6.0.7" />
    <PackageReference Include = "Microsoft.EntityFrameworkCore.Design" Version = "6.0.6">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include = "Microsoft.Graph" Version = "4.34.0" />
    <PackageReference Include = "Microsoft.Identity.Client" Version = "4.48.1" />
    <PackageReference Include = "Microsoft.Identity.Web" Version = "1.16.0" />
    <PackageReference Include = "Microsoft.Identity.Web.MicrosoftGraph" Version = "1.16.0" />
    <PackageReference Include = "Microsoft.PowerPlatform.Dataverse.Client" Version = "1.0.9" />
    <PackageReference Include = "Microsoft.VisualStudio.Web.CodeGeneration.Design" Version = "6.0.6" />
    <PackageReference Include = "Newtonsoft.Json" Version = "13.0.1" />
    <PackageReference Include = "Polly" Version = "7.2.3" />
    <PackageReference Include = "RestSharp" Version = "106.13.0" />
    <PackageReference Include = "Serilog" Version = "2.11.0" />
    <PackageReference Include = "Serilog.Extensions.Hosting" Version = "5.0.0" />
    <PackageReference Include = "Serilog.Extensions.Logging" Version = "3.1.0" />
    <PackageReference Include = "Serilog.Sinks.AzureAnalytics" Version = "4.8.0" />
    <PackageReference Include = "Swashbuckle.AspNetCore" Version = "6.2.3" />
    <PackageReference Include = "System.ComponentModel.Annotations" Version = "5.0.0" />
    <PackageReference Include = "System.Net.Http" Version = "4.3.4" />
    <PackageReference Include = "TypeSafe.Http.Net.HttpClient" Version = "2.2.16" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include = "someprojectpath" />
    <ProjectReference Include = "someprojectpath" />
    <ProjectReference Include = "someprojectpath" />
  </ItemGroup>

  <ItemGroup>
    <Content Update = "local.settings.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Update = "appsettings.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

</Project>

appsettings.json:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "domain",
    "TenantId": "tenantid",
    "ClientId": "clientid",
    "Scopes": "access_as_user",
    "CallbackPath": "/signin-oidc",
    "ClientSecret": "Client secret from app-registration. Check user secrets/azure portal.",
    "ClientCertificates": []
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AzureKeyVaultUrl": "keyvaulturl",
  "AllowedHosts": "*",
  "MicrosoftGraph": {
    "BaseUrl": "https://graph.microsoft.com/v1.0",
    "Scopes": "user.read"
  },
  "ApplicationInsights": {
    "ConnectionString": "appinsightsconnectionstring"
  }
}

Обновлено: Я узнал, что причиной ошибки являются эти строки:

var azureKeyVaultUrl = builder.Configuration[AppConfigurationConst.AzureKeyVaultUrl];
var logAnalyticsWorkspaceId = AzureKeyVaultHelper.GetAzureKeyVault(azureKeyVaultUrl, AppConfigurationConst.LogAnalyticsWorkspaceId);
var logAnaliticsAuthenticationId = AzureKeyVaultHelper.GetAzureKeyVault(azureKeyVaultUrl, AppConfigurationConst.LogAnaliticsAuthenticationId);
var CrmConnectionString = AzureKeyVaultHelper.GetAzureKeyVault(azureKeyVaultUrl, AppConfigurationConst.OneCrmConnectionString);

С тех пор я изменил их, чтобы получать значения непосредственно из конфигурации, а не из хранилища ключей:

var azureKeyVaultUrl = builder.Configuration.GetValue<string>(AppConfigurationConst.AzureKeyVaultUrl);
var logAnalyticsWorkspaceId = builder.Configuration.GetValue<string>(AppConfigurationConst.LogAnalyticsWorkspaceId);
var logAnaliticsAuthenticationId = builder.Configuration.GetValue<string>(AppConfigurationConst.LogAnaliticsAuthenticationId);
var CrmConnectionString = builder.Configuration.GetValue<string>(AppConfigurationConst.OneCrmConnectionString);

При локальном запуске он правильно принимает значения и присваивает их переменным. Но похоже, что при развертывании он сталкивается с проблемой с этим. В строке var serviceClient = new ServiceClient(CrmConnectionString); при изменении переменной на статическую строку работает корректно, но при использовании переменной выскакивает ошибка startup.cs (только при деплое). То же самое с инициализацией регистратора, который использует значения анализа журнала. Опять же, локально запускается без проблем, вылетает только деплоймент.

Не могли бы вы поделиться своим файлом .csproj один раз.

Harshitha 01.02.2023 05:18

Также, пожалуйста, поделитесь своим полным файлом Program.cs один раз.

Harshitha 01.02.2023 05:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
355
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я создал образец ASP.NET Core 6.0 Web API и смог развернуть приложение на Azure App Service без ошибок.

Как правило, этот тип ошибки возникает при наличии какой-либо ошибки в коде или проблемах с конфигурацией.

В моей версии проекта нет Startup.cs, а есть Program.cs

.Net6 Core Структура папок:

Да, нам нужно Configure код, связанный с Swagger, в самом Program.cs.

Проверьте приведенные ниже шаги и убедитесь, что вы выполняете их для развертывания без каких-либо проблем.

  • Выберите шаблон ASP.NET Core Web API.

  • Выберите Enable openAPI support.

Мой .csproj файл:

<Project Sdk = "Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include = "Swashbuckle.AspNetCore" Version = "6.2.3" />
  </ItemGroup>
</Project>

Мой Program.cs файл:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}
else
{
    app.UseSwagger();
    app.UseSwaggerUI(options =>
    {
        options.SwaggerEndpoint("/swagger/v1/swagger.json", "v1");
        options.RoutePrefix = string.Empty;
    });
}

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

Выходные данные развернутой службы приложений Azure:

Это в основном то, что я сделал в этом проекте, но мои .csproj и Program.cs более обширны. Я добавил их в пост.

Dario 01.02.2023 12:26

@Дарио - хорошо, поработаю над этим и дам вам знать. Проверим с вашим кодом один раз.

Harshitha 01.02.2023 12:53

Пожалуйста, поделитесь своим appsettings.json файлом.

Harshitha 01.02.2023 13:38

добавлен appsettings.json

Dario 01.02.2023 16:34

Вы добавляете APPLICATIONINSIGHTS_CONNECTION_STRING в builder.Services.AddApplicationInsightsTelemetry. Работает ли он локально?

Harshitha 01.02.2023 17:56

Я думаю, что это должно быть APPLICATIONINSIGHTS_CONNECTIONSTRING, а не APPLICATIONINSIGHTS_CONNECTION_STRING. Пожалуйста, проверьте один раз.

Harshitha 01.02.2023 17:58

Параметр конфигурации для строки подключения App Insights соответствует параметру в службе приложений в Azure и является правильным. Приложение создается локально, выдает ошибку только при развертывании

Dario 02.02.2023 09:11

Я обновил вопрос, проблема, похоже, связана с извлечением значений из конфигурации.

Dario 02.02.2023 13:21

Да, я уже упомянул пункт во 2-й строке в своем ответе.

Harshitha 02.02.2023 13:25

Другие вопросы по теме