Странная ошибка Blazor: крит: blazor.webassembly.js:1Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100]

Когда я создаю веб-приложение blazor, которое я публикую в среде linux-64, веб-приложение запускается, работает ненадолго (достаточно долго, чтобы я мог успешно войти в систему), а затем завершается с ошибкой, указанной выше. Я вставил всю трассировку стека ниже - похоже, она не проливает света на ситуацию, по словам человека, ответственного за код blazor. Я говорю «странно», потому что все мои коллеги могут создавать, публиковать и запускать приложение без проблем, используя точно такой же код, который я использую. Хотя это приводит меня к выводу, что с моей машиной что-то не так, есть также сервер сборки, демонстрирующий ту же проблему, что означает, что две системы потерпели один и тот же сбой, что, по меньшей мере, странно. Мы провели отладку и обнаружили, что сбой происходит где-то за пределами нашего кода. Я использую VS 2022 и VS 2019.

Что я сделал, чтобы исправить ситуацию (в том порядке, в котором я это делал):

  • Публикуется в других режимах (удаленная отладка, выпуск и т. д.)
  • Перезапущен VS
  • Построен с VS 2022
  • Перезагрузил компьютер
  • Исправлен VS 2022, повторил вышеописанное (кроме 2019)
  • Отремонтирован VS 2019, перестроен с VS 2019
  • Удален VS 2022, пересобран с VS 2019
  • Удален VS 2019
  • Переустановил VS 2019, пересобрал
  • Переустановил VS 2022, собрал VS 2019.
  • Удален VS 2019
  • Переустановил VS 2019, пересобрал
  • Повторил вышеописанное в нашей среде сборки.

Очевидно, все это не имело никакого значения, иначе меня бы здесь не было. Я полностью поставил в тупик всю свою команду. Что я мог упустить? Где еще искать ошибки? Ниже я привожу всю трассировку стека.

blazor.webassembly.js:1 crit: Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] Unhandled exception rendering component: ConstructorParamIncompleteBinding, Void .ctor(System.String, System.String), System.Tuple2[System.String,System.String] System.InvalidOperationException: ConstructorParamIncompleteBinding, Void .ctor(System.String, System.String), System.Tuple2[System.String,System.String] at System.Text.Json.ThrowHelper.ThrowInvalidOperationException_ConstructorParameterIncompleteBinding(ConstructorInfo , Type ) at System.Text.Json.Serialization.Converters.ObjectWithParameterizedConstructorConverter1[[System.Tuple2[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].OnTryRead(Utf8JsonReader& , Type , JsonSerializerOptions , ReadStack& , Tuple2& ) at System.Text.Json.Serialization.JsonConverter1[[System.Tuple2[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].TryRead(Utf8JsonReader& , Type , JsonSerializerOptions , ReadStack& , Tuple2& ) at System.Text.Json.Serialization.JsonConverter1[[System.Tuple2[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].ReadCore(Utf8JsonReader& , JsonSerializerOptions , ReadStack& ) at System.Text.Json.JsonSerializer.ReadCore[Tuple2](JsonConverter , Utf8JsonReader& , JsonSerializerOptions , ReadStack& ) at System.Text.Json.JsonSerializer.ReadCore[Tuple2](JsonReaderState& , Boolean , ReadOnlySpan1 , JsonSerializerOptions , ReadStack& , JsonConverter ) at System.Text.Json.JsonSerializer.<ReadAsync>d__201[[System.Tuple2[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext() at System.Net.Http.Json.HttpContentJsonExtensions.<ReadFromJsonAsyncCore>d__31[[System.Tuple2[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext() at System.Net.Http.Json.HttpClientJsonExtensions.<GetFromJsonAsyncCore>d__91[[System.Tuple`2[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext() at BlazorWebApp.Client.Pages.Alarms.OnInitializedAsync() at Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync() at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task )

Метод OnInitializedAsync: (И будьте осторожны — я не писал этот код, и парень, который это сделал, был новичком в blazor, когда он это сделал. Тем не менее, мы рады получить конструктивную критику.)

    protected override async Task OnInitializedAsync()
    {
        _token = await sessionStorage.GetItemAsStringAsync("token");
        if(_token == null)
        {
            cts = new CancellationTokenSource();
            NavMgr.NavigateTo("?redirect=alarms");
            return;
        }
        _token = _token.Replace("\"", "");

        if (!(await Http.GetFromJsonAsync<bool>($"User/IsAuthenticated token={_token}")))
        {
            cts = new CancellationTokenSource();
            NavMgr.NavigateTo("?redirect=alarms");
            return;
        }
        _permissions = await Http.GetFromJsonAsync<Dictionary<UserMgr.eAction, bool> 
                     ($"User/Permissions?token={_token}");
    //throws on the next line
        _userInfo = await Http.GetFromJsonAsync<Tuple<string, string>>
                     ($"User/UserInfo?token={_token}");
        _username = _userInfo.Item1;
        _password = _userInfo.Item2;
        _userInfo = new(_username, _password);
        if (_permissions[UserMgr.eAction.ViewAlerts])
        {
            _alarms = await Http.GetFromJsonAsync<List<WebAppAlarm>>
                      ($"Alarms/GetAlarms?numAlarms={10}&offset={0}");
            totalAlarms = await Http.GetFromJsonAsync<int>
                          ("Alarms/GetNumberOfAlarms");
            _dates = new List<string>();
            _speedBands = new List<Tuple<int, int>>();
            _conditionStates = new List<string>();
            foreach (WebAppAlarm a in _alarms)
            {
                if (!_dates.Exists(x => x == a.Date.ToShortDateString()))
                    _dates.Add(a.Date.ToShortDateString());
                if (!_speedBands.Exists(x => 
                    x.Item1 == a.SpeedBand.Item1 &&
                    x.Item2 == a.SpeedBand.Item2))
                    _speedBands.Add(a.SpeedBand);
                if (!_conditionStates.Exists(x => x == a.ConditionStateName))
                    _conditionStates.Add(a.ConditionStateName);
                if (a.AlarmLevel == AlarmLevel.OK 
                     && a.AckIgn == AckIgnoreState.None)
                {
                    await AlarmAckClicked(a);
                }
            }
            _showRaptorBusy = true;
            while (_showRaptorBusy)
            {
                try
                {
                    var response = await Http.PostAsJsonAsync<Tuple<string, string>>
                        ("Machines/GetMachines", _userInfo);
                    _machines = await response.Content.
                     ReadFromJsonAsync<List<WebAppMachine>>();
                    _showRaptorBusy = false;
                }
                catch (SystemException e)
                {
                    Console.WriteLine("Exception: " + e.Message);
                    _retryCount++;
                    _showRaptorBusy = true;
                    await Task.Delay(1000);
                    StateHasChanged();
                }
            }
            if (_alarms.Count > 0)
                await AlarmRowClicked(_alarms[_alarms.Count - 1]);
            if (CompId != null && _alarms.Exists(a =>
               (a.CompID.ToString() == CompId &&
                a.FaultType.ToString() == FaultType &&
                a.AlarmLevel.ToString() == Level &&
                a.Date.ToShortTimeString().Replace(" ", "") == Time)))
            {
                CompId = HttpUtility.UrlDecode(CompId);
                FaultType = HttpUtility.UrlDecode(FaultType);
                Level = HttpUtility.UrlDecode(Level);
                Time = HttpUtility.UrlDecode(Time);
                WebAppAlarm a = _alarms.Find(a => 
                (a.CompID.ToString() == CompId &&  
                 a.FaultType.ToString() == FaultType &&
                 a.AlarmLevel.ToString() == Level &&
                 a.Date.ToShortTimeString().Replace(" ", "") == Time));
                await AlarmRowDblClick(a);
            }
            string blink;
            if ((blink = await JSR.InvokeAsync<string>("getCookie", "blinkingEnabled")) != "")
            {
                _showBlinking = bool.Parse(blink);
            }
            await Http.PostAsJsonAsync<List<WebAppAlarm>>
                  ("Alarms/ExportAlarms", _alarms);
            toggleGetAlarms();
        }

        _isReady = true;
    }

У вас случайно нет страницы "Будильник"? Если да, то переопределяет ли он «OnInitializedAsync» и если да, то какова его реализация?

Fildor 22.04.2022 18:40

Согласно Эта проблема, эта ошибка может быть вызвана отсутствием общедоступного конструктора без параметров в ваших типах JSON. Это был ломающее изменение с .net5, хотя для меня загадка, почему это не будет проблемой везде.

Kirk Woll 22.04.2022 19:20

@Fildor Я добавил рассматриваемый метод. Я лишь поверхностно знаком с Blazor, поэтому мне может потребоваться некоторое время, чтобы ответить вам.

Raligan 22.04.2022 20:21

Я нашел, где происходит сбой, и отметил его в коде.

Raligan 22.04.2022 20:57

@Raligan - я считаю потенциальные 5 получения и 2 сообщения в компоненте OnInitialisedAsync. Первое слово, которое пришло на ум, непечатно!! Ошибка в том, что возвращается как этот кортеж. Код нуждается в рефакторинге, чтобы вы могли внести некоторые записи в журнал и посмотреть, что вы получите в ответ. Я знаю, мало что поможет, но для стороннего наблюдателя большая часть кода — тарабарщина!

MrC aka Shaun Curtis 22.04.2022 23:50

@MrCakaShaunCurtis Можете ли вы уточнить, что вы подразумеваете под непечатным? Я никогда не слышал этот термин, связанный с кодом.

Raligan 25.04.2022 14:53
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
6
90
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я обнаружил проблему. Общим для двух систем была установка VS 2022. Другие среды сборки еще не переключились, поэтому они были защищены от того, что я могу только предположить, что это ошибка. В конечном счете, удаления VS 2022 было недостаточно, потому что виновником был .NET 6 SDK, который устанавливается вместе с VS 2022, но не удаляется вместе с удалением VS 2022. Как только я удалил SDK, все вернулось к нормальной работе.

К счастью, наличие SDK на компьютере пользователя не имеет значения; только потому, что у них установлен .NET 6, это не меняет выполнение двоичного файла. Двоичные файлы, созданные .NET 5 и 6, немного отличаются. Я подтвердил это с помощью vbindiff, хотя, признаюсь, я не знаю, в чем именно заключаются различия.

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