Как исправить исключения SerializationNotSupportedParentType и ThrowNotSupportedException_ConstructorContainsNullParametC#

Место общения программистов C#
Ответить
Anonymous
 Как исправить исключения SerializationNotSupportedParentType и ThrowNotSupportedException_ConstructorContainsNullParamet

Сообщение Anonymous »

Я столкнулся со следующей проблемой, решение которой может помочь другим, поскольку я не смог найти ответа на вопрос о переполнении стека.
В настоящее время я работаю над PWA C# Blazor Webassembly. Мы публикуем и размещаем его в Windows Azure.
Мы начали получать подобные ошибки в нашей среде Github CI:
ошибка NU1903: предупреждение как ошибка: Пакет «System.Text.Json» 7.0.0 имеет известную уязвимость высокой степени серьезности, https://github.com/advisories/GHSA-hh2w-p6rv-4g7w
Мы работаем на .Net 7 и еще не совсем готов к обновлению до .net 8, поэтому я изучил его и обнаружил, что могу просто обновить System.Text.Json до v8.0.5, которая была самой низкой версией, в которой проблема безопасности была исправлена ​​и последняя версия, которая могла работать на .Net 7, прежде чем требовалась .Net 8.
Затем мы столкнулись с этой проблемой во время выполнения. (Я включил только важные части трассировки стека):

Код: Выделить всё

Microsoft.AspNetCore.Components.Web.ErrorBoundary[0]
System.AggregateException: AggregateException_ctor_DefaultMessage (ConstructorContainsNullParameterNames, System.Collections.Generic.KeyValuePair`2[System.String,System.String] SerializationNotSupportedParentType, System.Object Path: $.)
---> System.NotSupportedException: ConstructorContainsNullParameterNames, System.Collections.Generic.KeyValuePair`2[System.String,System.String] SerializationNotSupportedParentType, System.Object Path: $.
---> System.NotSupportedException: ConstructorContainsNullParameterNames, System.Collections.Generic.KeyValuePair`2[System.String,System.String]
at System.Text.Json.ThrowHelper.ThrowNotSupportedException_ConstructorContainsNullParameterNames(Type )
...
at System.Text.Json.Serialization.JsonConverter`1[[System.Object[], System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].WriteCore(Utf8JsonWriter , Object[]& , JsonSerializerOptions , WriteStack& )
...
at Telerik.Blazor.Components.Common.DateInputs.DateInput`1.d__186[[System.Nullable`1[[System.DateTime, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext()
Оказывается, причина этого в том, что TelerikDatePicker, который мы используем, сериализует KeyValuePairs с помощью взаимодействия, поэтому он работает с частью javascript элемента управления.
Мы использовали Telerik.UI.for.Blazor v4.4.0, и похоже, что Telerik исправил эту проблему в версии 5.0.1. Однако это серьезное обновление компонентов Telerik с множеством критических изменений, и поскольку все началось с предупреждений безопасности, когда мы хотели создать кандидата на выпуск, нам пока не хотелось обновляться до версии 5.0.1, поскольку это все отложить.
Оказывается, эта проблема вовсе не в Телерике, проблему можно воспроизвести и без компонентов Телерика. Они используют отражение для поиска значений и типов, которые сериализуют, и это настоящая проблема.
Еще одна странная вещь, которую мы обнаружили, заключалась в том, что мы не смогли воспроизвести ошибку на наших машинах разработчиков. Это произошло ТОЛЬКО тогда, когда мы опубликовали приложение WASM в Windows Azure.
Короче говоря, оказывается, что основной причиной этой ошибки является регрессия в .Net 8. У них есть внесено критическое изменение в компоновщик, так что при включении обрезки сборок (что происходит по умолчанию при публикации WASM Aps в Windows Azure) сборки, которые используются только посредством отражения, например, сборки, содержащие Тип KeyValuePair обрезается, поэтому его больше нельзя найти во время выполнения.
Почему это происходит, когда мы запускаем .Net 7? В нашем случае новейшие среды выполнения .Net установлены в Windows Azure .Net v9.0. Несмотря на то, что System.Text.Json v8.0.5 отлично работает на .Net 7, он будет использовать среду выполнения .Net 8 и .Net 9 (где эта регрессия все еще присутствует), если он установлен на компьютере, поскольку после версий .Net 3.5 .Net заменяют друг друга.
Подробнее можно прочитать здесь: https://github.com/dotnet/aspnetcore/issues/52947

Подробнее здесь: https://stackoverflow.com/questions/793 ... dexception
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»