#c# #docker #asp.net-core #json.net #nuget
#c# #docker #asp.net-core #json.net #nuget
Вопрос:
На macOS. Похоже, эта проблема вызвана Google.Облако.Storage.V1.
Это мой csproj:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace>devopsapp_gke</RootNamespace>
<!-- Add these BindingRedirects settings makes no difference -->
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Google.Cloud.Storage.V1" Version="3.3.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="4.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer" Version="4.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Log4Net.AspNetCore" Version="3.1.0" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.6.1" />
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="5.6.1" />
</ItemGroup>
</Project>
Код просто делает это:
var storage = StorageClient.Create();
foreach (var bucketobj in storage.ListObjects("mybucket", "")) { }
Заглядывая внутрь myapp.deps.json
, я вижу ЕДИНСТВЕННУЮ версию Newtonsoft.Json в любой зависимости равен 12.0.3
Локально я могу работать dotnet run -p ./myapp/myapp.csproj
без проблем. Запускал dotnet nuget locals all --clear
и запускал снова, и он все еще работает.
Я пытаюсь запустить это в контейнере Docker и получаю:
Could not load file or assembly 'Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'. The located assembly's manifest definition does not match the assembly reference. (0x80131040)
File name: 'Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'
at Google.Apis.Json.NewtonsoftJsonSerializer..ctor()
at Google.Apis.Json.NewtonsoftJsonSerializer..cctor()
Вытащил Dockerfile прямо из официальных документов:
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app
COPY . ./
RUN dotnet nuget add source "https://myrepo" --name mysource --username "myuser" -p "mypass" --store-password-in-clear-text
RUN dotnet restore
RUN dotnet publish -c Release -o out --no-restore
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "myapp.dll"]
Запустив контейнер, я получаю следующее:
Could not load file or assembly 'Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'. The located assembly's manifest definition does not match the assembly reference. (0x80131040)
File name: 'Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'
at Google.Apis.Json.NewtonsoftJsonSerializer..ctor()
at Google.Apis.Json.NewtonsoftJsonSerializer..cctor()
Что происходит? Я могу запустить в контейнер и подтвердить наличие библиотеки DLL Newtonsoft.
Редактировать
Я пропустил это, потому что не думал, что это связано, но я обнаружил, что удаление моего собственного источника nuget решает проблему, но мне нужно добавить этот источник, чтобы получить мои пользовательские пакеты.
RUN dotnet restore
Работает после запуска nuget add source и даже dotnet restore --no-cache --force
работает без ошибок. но я получаю эту ошибку во время выполнения.
Почему мой частный источник nuget вызывает эту проблему? Восстановление завершается успешно, и я вижу DLL. Частный источник nuget является репозиторием артефактов, зеркально отображающим репозитории Microsoft. Разве это не должно просто завершиться неудачей, если он не может найти нужный пакет?
Комментарии:
1. Вы могли бы обойти всю проблему, используя функциональность JSON, встроенную в .netcore 3 . Я знаю, что это не решает вашу проблему, но может быть путем наименьшего сопротивления.
2. я не могу. библиотека, которую я использую, зависит от нее
Ответ №1:
Вы пробовали добавлять <RestoreProjectStyle>PackageReference</RestoreProjectStyle>
в свой .csproj?
<PropertyGroup>
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
...
</PropertyGroup>
Это помогло мне с аналогичной проблемой, когда я получал эти ошибки при запуске контейнера Docker, но не при отладке из VS на Mac.