У меня возникла проблема при попытке развернуть мою службу приложений в Azure из VS 2022. Каждый раз, когда я получаю эту ошибку:
Я использую .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 (только при деплое). То же самое с инициализацией регистратора, который использует значения анализа журнала. Опять же, локально запускается без проблем, вылетает только деплоймент.
Также, пожалуйста, поделитесь своим полным файлом Program.cs
один раз.
Я создал образец 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 более обширны. Я добавил их в пост.
@Дарио - хорошо, поработаю над этим и дам вам знать. Проверим с вашим кодом один раз.
Пожалуйста, поделитесь своим appsettings.json
файлом.
добавлен appsettings.json
Вы добавляете APPLICATIONINSIGHTS_CONNECTION_STRING
в builder.Services.AddApplicationInsightsTelemetry. Работает ли он локально?
Я думаю, что это должно быть APPLICATIONINSIGHTS_CONNECTIONSTRING
, а не APPLICATIONINSIGHTS_CONNECTION_STRING
. Пожалуйста, проверьте один раз.
Параметр конфигурации для строки подключения App Insights соответствует параметру в службе приложений в Azure и является правильным. Приложение создается локально, выдает ошибку только при развертывании
Я обновил вопрос, проблема, похоже, связана с извлечением значений из конфигурации.
Да, я уже упомянул пункт во 2-й строке в своем ответе.
Не могли бы вы поделиться своим файлом
.csproj
один раз.