В настоящее время я запускаю приложение .NET 8 Azure Function в Azure. Это изолированная от Dotnet функция, работающая в плане службы приложений Linux.
Я получаю эту ошибку при попытке запустить функцию триггера http:
Unhandled exception. System.IO.FileNotFoundException: Could not load file or assembly 'Azure.Core, Version=1.38.0.0, Culture=neutral, PublicKeyToken=92742159e12e44c8'. The system cannot find the file specified.
Решение состоит из четырех проектов: Application.csproj, Status.API.csproj, Domain.csproj и Infrastructure.csproj.
Вот пример пакетов Status.API.csproj.
<ItemGroup>
<FrameworkReference Include = "Microsoft.AspNetCore.App" />
<PackageReference Include = "AspNetCore.HealthChecks.SqlServer" Version = "7.0.0" />
<PackageReference Include = "Azure.Identity" Version = "1.11.0" />
<PackageReference Include = "Microsoft.ApplicationInsights" Version = "2.22.0" />
<PackageReference Include = "Microsoft.Azure.AppConfiguration.Functions.Worker" Version = "7.2.0" />
<PackageReference Include = "Microsoft.Azure.Functions.Worker" Version = "1.21.0" />
<PackageReference Include = "Microsoft.Azure.Functions.Worker.Extensions.Http" Version = "3.1.0" />
<PackageReference Include = "Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore" Version = "1.2.0" />
<PackageReference Include = "Microsoft.Azure.Functions.Worker.Sdk" Version = "1.17.0" />
<PackageReference Include = "Microsoft.ApplicationInsights.WorkerService" Version = "2.22.0" />
<PackageReference Include = "Microsoft.Azure.Functions.Worker.ApplicationInsights" Version = "1.2.0" />
<PackageReference Include = "Microsoft.EntityFrameworkCore.SqlServer" Version = "7.0.20" />
<PackageReference Include = "Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version = "1.19.6" />
<PackageReference Include = "Newtonsoft.Json" Version = "13.0.1" />
</ItemGroup>
Я использую пакет dotnet list --include-transitive, чтобы попытаться определить, что ищет версию Azure.Core 1.38, и он сообщает мне, что есть пакет, использующий его, но мне нужно вручную проверить это. например Azure.Identity использует Azure.Core(>=1.38.0).
Я попытался понизить версию пакетов, думая, что функции не используют последнюю версию .NET 8.
Я еще немного понизлю версию пакетов NuGet.
Я прошёл Функции «Диагностика и решение проблем»:
Функция «Приложение отключено» или изображение «Отчет об ошибках»
Обновлено:
Вот пример, если PropertyGroup:
<Project Sdk = "Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<AzureFunctionsVersion>v4</AzureFunctionsVersion>
<OutputType>Exe</OutputType>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<DockerFastModeProjectMountDirectory>/home/site/wwwroot</DockerFastModeProjectMountDirectory>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>
РЕДАКТИРОВАТЬ
Последнее, о чем я подумал, — это удалить юнит-тесты, и с удалением тестов все заработало. Я подозреваю, что это пакет Testcontainers.MsSql (<PackageReference Include = "Testcontainers.MsSql" Version = "3.9.0" />
).
Я все еще инвестирую его зависимости.
Контекст для пакетов тестовой библиотеки
<ItemGroup>
<PackageReference Include = "coverlet.collector" Version = "6.0.0" />
<PackageReference Include = "Microsoft.EntityFrameworkCore.SqlServer" Version = "8.0.7" />
<PackageReference Include = "Microsoft.NET.Test.Sdk" Version = "17.8.0" />
<PackageReference Include = "Moq" Version = "4.20.70" />
<PackageReference Include = "Testcontainers.MsSql" Version = "3.9.0" />
<PackageReference Include = "xunit" Version = "2.5.3" />
<PackageReference Include = "xunit.runner.visualstudio" Version = "2.5.3" />
</ItemGroup>
ОТВЕЧАТЬ
@Pravallika направила меня на правильный путь, большое спасибо, по какой-то причине <PackageReference Include = "Microsoft.EntityFrameworkCore.SqlServer" Version = "8.0.7" />
ссылался на более старую версию Azure.Identity
, затем я обновил Azure.Identity
до версии 1.11.4, но затем я получил новую ошибку:
Unhandled exception. System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Bcl.AsyncInterfaces, Version=5.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified.
Затем мне пришлось обновить Microsoft.Bcl.AsyncInterfaces
до последней версии, я еще не уверен на 100%, почему он ссылается на более старую версию, хотя кажется, что это не так, но это работает.
@jdweng Я добавил <PackageReference Include = "Azure.Core" Version = "1.38.0" />, но та же ошибка. Какая версия версия неправильная?
Обновите версию Azure.Identity
до 1.12.0
и Azure.Core
до 1.40.0
. Это сработало для меня.
Моей отправной точкой была 1.41.0, а затем я понизил ее. Я даже пытался запустить его в док-контейнере Linux локально, и он работает, я что-то упускаю? Есть ли несоответствие версии самого приложения-функции, которого я не вижу...
Попробуйте добавить <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
в раздел PropertyGroup в .csproj.
Добавлена привязка в PropertyGroup, к сожалению, та же ошибка. Я обновил описание примером
Если вы используете Net 4.6, Core 6 или Core 8, вам нужна версия 4x, а не 1x. См. Learn.microsoft.com/en-us/azure/azure-functions/… , чтобы установить версию, см. Learn.microsoft.com/en-us/azure/azure-functions/…
Не знаю, где вы видите версию 1x, я использую версию 4x. У меня просто возникло ощущение, что я удалил модульные тесты, и это сработало. Теперь вопрос: почему? Пока что <PackageReference Include = "Testcontainers.MsSql" Version = "3.9.0" />
может быть проблемой. Занят расследованием.
Проблема может быть связана с уязвимостью/несовместимостью установленных версий пакетов.
Я установил версию Azure.Identity
1.11.4 для совместимости с Azure.Core
версией 1.38.0:
Я использовал те же пакеты в своем проекте с приведенными ниже версиями, и приложение-функция работало как положено.
.csproj:
<Project Sdk = "Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<AzureFunctionsVersion>v4</AzureFunctionsVersion>
<OutputType>Exe</OutputType>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include = "Microsoft.AspNetCore.App" />
<PackageReference Include = "AspNetCore.HealthChecks.SqlServer" Version = "7.0.0" />
<PackageReference Include = "Azure.Extensions.AspNetCore.Configuration.Secrets" Version = "1.3.1" />
<PackageReference Include = "Azure.Identity" Version = "1.11.4" />
<PackageReference Include = "Microsoft.ApplicationInsights" Version = "2.22.0" />
<PackageReference Include = "Microsoft.Azure.Functions.Worker" Version = "1.21.0" />
<PackageReference Include = "Microsoft.Azure.Functions.Worker.Extensions.Http" Version = "3.1.0" />
<PackageReference Include = "Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore" Version = "1.2.0" />
<PackageReference Include = "Microsoft.Azure.Functions.Worker.Sdk" Version = "1.17.0" />
<PackageReference Include = "Microsoft.ApplicationInsights.WorkerService" Version = "2.22.0" />
<PackageReference Include = "Microsoft.Azure.Functions.Worker.ApplicationInsights" Version = "1.2.0" />
<PackageReference Include = "Microsoft.Extensions.Configuration" Version = "8.0.0" />
<PackageReference Include = "Microsoft.Azure.AppConfiguration.Functions.Worker" Version = "7.2.0" />
<PackageReference Include = "Microsoft.EntityFrameworkCore.SqlServer" Version = "7.0.20" />
<PackageReference Include = "Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version = "1.19.6" />
<PackageReference Include = "Newtonsoft.Json" Version = "13.0.1" />
</ItemGroup>
<ItemGroup>
<None Update = "host.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update = "local.settings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</None>
</ItemGroup>
<ItemGroup>
<Using Include = "System.Threading.ExecutionContext" Alias = "ExecutionContext" />
</ItemGroup>
</Project>
Пакеты, доступные в тестовом проекте:
<Project Sdk = "Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include = "Azure.Extensions.AspNetCore.Configuration.Secrets" Version = "1.3.1" />
<PackageReference Include = "coverlet.collector" Version = "6.0.0" />
<PackageReference Include = "Microsoft.EntityFrameworkCore.SqlServer" Version = "8.0.7" />
<PackageReference Include = "Microsoft.Extensions.Configuration" Version = "8.0.0" />
<PackageReference Include = "Microsoft.Extensions.Configuration.AzureAppConfiguration" Version = "7.3.0" />
<PackageReference Include = "Microsoft.NET.Test.Sdk" Version = "17.8.0" />
<PackageReference Include = "Moq" Version = "4.20.70" />
<PackageReference Include = "Testcontainers.MsSql" Version = "3.9.0" />
<PackageReference Include = "xunit" Version = "2.5.3" />
<PackageReference Include = "xunit.runner.visualstudio" Version = "2.5.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include = "..\FunctionApp2\FunctionApp2.csproj" />
</ItemGroup>
<ItemGroup>
<Using Include = "Xunit" />
</ItemGroup>
</Project>
Версия неверная. Обычно я рекомендую в Visual Studio Solution Explorer удалить ссылку на библиотеку. Затем добавьте ссылку еще раз, используя меню «Проект»: «Добавить ссылку». Добавление ссылки устранит проблему с версией.