Blazor — метод запуска в program.cs выдает ошибку «Произошла необработанная ошибка»C#

Место общения программистов C#
Ответить
Anonymous
 Blazor — метод запуска в program.cs выдает ошибку «Произошла необработанная ошибка»

Сообщение Anonymous »

Я пытаюсь создать свое первое приложение Blazor для личных целей и столкнулся с ошибкой.

Произошла необработанная ошибка

, которая отображается внизу страницы. Я использую Visual Studio 2022 и шаблон автономного приложения Blazor WebAssembly.
Вот что вызывает появление этой ошибки, но я не понимаю, почему. В Program.cs я хочу создать объект, который я добавлю как синглтон, чтобы позже можно было внедрить его на страницы, которым необходим доступ к нему. Показанный здесь код работает нормально:

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

public static async Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);

builder.RootComponents.Add("#app");
builder.RootComponents.Add("head::after");

builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });

List Portfel = [];
builder.Services.AddSingleton(Portfel);

await builder.Build().RunAsync();
}
Класс My Portfolio имеет конструктор, который вызывает несколько методов для получения данных во время построения. Этот класс работает правильно, когда я тестирую его в консольном приложении или когда я использую его как фрагмент кода в компоненте Razor.
Однако, чтобы он работал в Program.cs, мне нужно закомментировать части конструктора, как показано здесь:

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

public class Portfolio
{
public string ID { get; private set; }
public string Name { get; private set; }
public decimal Value { get; private set; }
public decimal ValueBankDeposits {  get; private set; }
public decimal ValueStocks { get; private set; }
public decimal ValueETFs { get; private set; }
public decimal ValueFunds { get; private set; }
public decimal ValueBondsCorp { get; private set; }
public decimal ValueBondsTreasury { get; private set; }

public List BankDeposits { get; private set; }
public List Stocks { get; private set; }
public List ETFs { get; private set; }
public List Funds { get; private set; }
public List BondsCorp { get; private set; }
public List BondsTreasury { get; private set; }

public Portfolio(string iD, string name)
{
Name = name;
ID = iD;
//BankDeposits = DB.GetPortfolioBankDepositData(ID);
//Stocks = DB.GetPortfolioEquityData(ID);
//ETFs = DB.GetPortfolioETFData(ID);
//Funds = DB.GetPortfolioFundData(ID);
//BondsCorp=DB.GetPortfolioCorpBondData(ID);
//BondsTreasury=DB.GetPortfolioTreasuryBondData(ID);

}
}
Всякий раз, когда я пытаюсь создать этот класс с данными и оставить весь конструктор без комментариев, я получаю упомянутое сообщение об ошибке и не могу понять, почему. Как указывалось ранее, приведенный ниже код работает как в консольном приложении, так и в качестве фрагмента кода в компоненте Razor, но не в Program.cs.

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

List Portfel = [];
Portfolio a = new("01", "Test");
РЕДАКТИРОВАТЬ: после некоторого дополнительного тестирования и предложений я обнаружил, что проблема заключается в том, что внутри статического класса БД я использую пакет MySQLConnector Nuget и думаю, что он еще не готов к запуску, когда я пытаюсь использовать его в Program.cs.
Вот некоторый код БД, просто чтобы дать вам представление о том, что я там делаю. Я сократил его до двух методов, все остальные аналогичны, только с другим SQL-запросом.

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

public static class DB
{
/// 
/// Wysyła zaptanie do bazy i zwraca odpowiedź
/// baza zdefiniowana na stałe "portfele"
/// 
/// 
Zapytanie SQL
/// 
internal static List GetData(string SQLCommand)
{
var ConnStr = new MySqlConnectionStringBuilder
{
Server = "127.0.0.1",
UserID = "root",
Password = "",
Database = "portfele",
};

int i;
List result = new();

using MySqlConnection DB = new MySqlConnection(ConnStr.ConnectionString);
DB.Open();

using var SQL = new MySqlCommand(SQLCommand, DB);
using MySqlDataReader reader = SQL.ExecuteReader();

while (reader.Read())
{
List columns = new List();

for (i = 0; i < reader.FieldCount; i++)
{
columns.Add(reader[i].ToString());
}

result.Add(columns);
}

DB.Close();
return result;
}

/// 
/// Pobiera dane o aktualnych lokatach portfela
/// 
/// ID portfela
/// 
internal static List GetPortfolioBankDepositData(string id)
{
List result = new();

string sql = $"SELECT * , SUM(A.Koszty)" +
$"FROM _{id}_LOKATY A " +
$"GROUP BY A.Nazwa " +
$"HAVING SUM(A.Wplata+A.Koszty)>0";

List dbData= GetData(sql);

foreach (var row in dbData)
{
BankDeposit b = new BankDeposit(row[1], "PLN", Convert.ToDecimal(row[2]));
b.Income = Convert.ToDecimal(row[5]);
result.Add(b);
}

result.Sort((x, y) => x.Name.CompareTo(y.Name));

return result;
}
}
Мне кажется, что во время запуска приложения Blazor пакет NuGet MySqlConnector не готов к запуску, поэтому я получаю сообщение об ошибке.
Как этого избежать?>

Подробнее здесь: https://stackoverflow.com/questions/798 ... ror-occurr
Ответить

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

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

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

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

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