Когда я создаю веб-приложение blazor, которое я публикую в среде linux-64, веб-приложение запускается, работает ненадолго (достаточно долго, чтобы я мог успешно войти в систему), а затем завершается с ошибкой, указанной выше. Я вставил всю трассировку стека ниже - похоже, она не проливает света на ситуацию, по словам человека, ответственного за код blazor. Я говорю «странно», потому что все мои коллеги могут создавать, публиковать и запускать приложение без проблем, используя точно такой же код, который я использую. Хотя это приводит меня к выводу, что с моей машиной что-то не так, есть также сервер сборки, демонстрирующий ту же проблему, что означает, что две системы потерпели один и тот же сбой, что, по меньшей мере, странно. Мы провели отладку и обнаружили, что сбой происходит где-то за пределами нашего кода. Я использую VS 2022 и 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.Tuple
2[System.String,System.String] System.InvalidOperationException: ConstructorParamIncompleteBinding, Void .ctor(System.String, System.String), System.Tuple
2[System.String,System.String] at System.Text.Json.ThrowHelper.ThrowInvalidOperationException_ConstructorParameterIncompleteBinding(ConstructorInfo , Type ) at System.Text.Json.Serialization.Converters.ObjectWithParameterizedConstructorConverter1[[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]].OnTryRead(Utf8JsonReader& , Type , JsonSerializerOptions , ReadStack& , Tuple2& ) at System.Text.Json.Serialization.JsonConverter
1[[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& , Tuple
2& ) at System.Text.Json.Serialization.JsonConverter1[[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]].ReadCore(Utf8JsonReader& , JsonSerializerOptions , ReadStack& ) at System.Text.Json.JsonSerializer.ReadCore[Tuple2](JsonConverter , Utf8JsonReader& , JsonSerializerOptions , ReadStack& ) at System.Text.Json.JsonSerializer.ReadCore[Tuple
2](JsonReaderState& , Boolean , ReadOnlySpan1 , JsonSerializerOptions , ReadStack& , JsonConverter ) at System.Text.Json.JsonSerializer.<ReadAsync>d__20
1[[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__3
1[[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__9
1[[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;
}
Согласно Эта проблема, эта ошибка может быть вызвана отсутствием общедоступного конструктора без параметров в ваших типах JSON. Это был ломающее изменение с .net5, хотя для меня загадка, почему это не будет проблемой везде.
@Fildor Я добавил рассматриваемый метод. Я лишь поверхностно знаком с Blazor, поэтому мне может потребоваться некоторое время, чтобы ответить вам.
Я нашел, где происходит сбой, и отметил его в коде.
@Raligan - я считаю потенциальные 5 получения и 2 сообщения в компоненте OnInitialisedAsync
. Первое слово, которое пришло на ум, непечатно!! Ошибка в том, что возвращается как этот кортеж. Код нуждается в рефакторинге, чтобы вы могли внести некоторые записи в журнал и посмотреть, что вы получите в ответ. Я знаю, мало что поможет, но для стороннего наблюдателя большая часть кода — тарабарщина!
@MrCakaShaunCurtis Можете ли вы уточнить, что вы подразумеваете под непечатным? Я никогда не слышал этот термин, связанный с кодом.
Я обнаружил проблему. Общим для двух систем была установка VS 2022. Другие среды сборки еще не переключились, поэтому они были защищены от того, что я могу только предположить, что это ошибка. В конечном счете, удаления VS 2022 было недостаточно, потому что виновником был .NET 6 SDK, который устанавливается вместе с VS 2022, но не удаляется вместе с удалением VS 2022. Как только я удалил SDK, все вернулось к нормальной работе.
К счастью, наличие SDK на компьютере пользователя не имеет значения; только потому, что у них установлен .NET 6, это не меняет выполнение двоичного файла. Двоичные файлы, созданные .NET 5 и 6, немного отличаются. Я подтвердил это с помощью vbindiff, хотя, признаюсь, я не знаю, в чем именно заключаются различия.
У вас случайно нет страницы "Будильник"? Если да, то переопределяет ли он «OnInitializedAsync» и если да, то какова его реализация?