В прошлом, будучи разработчиками, мы узнали, что среды разработки не всегда хорошо переносятся в производственные среды. Это изначальный аспект этой статьи, который я хочу изучить и понять больше. Проще говоря, необходимая конфигурация IIS для запуска приложения Blazor представляет собой лабиринт, в котором, даже если вы проделали это несколько раз, вы заблудились в следующей конфигурации. Несмотря на то, что вы перечеркнули все свои буквы и расставили все точки над i, по какой-то причине производственная среда IIS, работающая на виртуальной машине Azure, вызывает у меня вопрос о необычности поведения среды Blazor, работающей на ней.
Во-первых, разработанному мной приложению требуется доступ к базе данных (для этой цели SQL Express), а в файле application.json строка подключения со всеми необходимыми учетными данными, безопасностью, шифрованием и т. д., чтобы иметь Приложение получает доступ к базе данных. В приложении я использую EF Core Identity для управления пользователями (зачем изобретать велосипед), поскольку мне нужны локальные учетные записи, а также взаимодействие с учетными записями OAUTH MS, AWS или Google. Взаимодействие управляется отдельно, поскольку я не могу использовать библиотеку MS Graph, если у меня есть доступ к OAUTH для AWS и/или Google.
Суть проблемы — это EF Core Identity. Наличие следующего кода (отрывка) в Сервисе в Приложении:
Код: Выделить всё
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
namespace MyNamespace
{
public class UserService
{
private readonly UserManager _userManager;
private readonly ILogger _logger;
private static readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1); // Allow only one operation at a time
public List Users { get; private set; } = new List();
public ApplicationUser User { get; private set; }
public UserService(UserManager userManager, ILogger logger)
{
_userManager = userManager;
_logger = logger;
}
public async Task LoadUsersAsync()
{
await _semaphore.WaitAsync(); // Asynchronously wait to enter
try
{
if (Users == null || !Users.Any())
{
Users = _userManager.Users.AsNoTracking().ToList(); // This prevents second operation error
_logger.LogInformation("Users loaded successfully.");
}
}
catch(Exception ex)
{
_logger.LogError(ex, "Error loading users.");
}
finally
{
_semaphore.Release(); // Release the semaphore
}
}
public async Task RefreshUsersAsync()
{
await _semaphore.WaitAsync();
try
{
Users = _userManager.Users.AsNoTracking().ToList(); // This prevents second operation error
}
finally
{
_semaphore.Release();
}
}
public async Task SetMe(ApplicationUser Me)
{
await _semaphore.WaitAsync();
try
{
User = _userManager.Users.AsNoTracking().FirstOrDefault(c => c.Id == Me.Id);
}
finally
{
_semaphore.Release();
}
}
public async Task UpdateUser(ApplicationUser Me)
{
await SetMe(Me);
await _semaphore.WaitAsync();
try
{
ApplicationUser freshUser = await _userManager.FindByIdAsync(Me.Id);
XMPUtilityClass XU = new XMPUtilityClass();
XU.CopyProperties(Me, freshUser);
var ret = await _userManager.UpdateAsync(freshUser);
return ret;
}
finally
{
_semaphore.Release();
}
}
}
}
Код: Выделить всё
@inject UserService US;
@code
{
protected override async Task OnInitializedAsync()
{
await US.LoadUsersAsync();
Users = US.Users;
}
... other code and functions ....
}
Код: Выделить всё
private void ChangeFilter(ChangeEventArgs e)
{
if(e.Value.ToString().Length >0)
{
FilteredUsers = Users.Where(c => c.FirstName.Contains(e.Value.ToString(), StringComparison.OrdinalIgnoreCase) || c.FirstLastName.Contains(e.Value.ToString(), StringComparison.OrdinalIgnoreCase)).ToList();
}
}
Код: Выделить всё
"Category: Microsoft.AspNetCore.Components.Server.Circuits.CircuitHostEventId: 111SpanId: 85fad198feb49aa3TraceId: 0c3026fa36b065b1c198ca23f4acc066ParentId: 0000000000000000RequestId: 4000075e-0001-ee00-b63f-84710c7967bbRequestPath: /_blazorTransportConnectionId: 27FNbZLL8yv1rXpg-Jc6HwUnhandled exception in circuit '74gA2uaQXxptSrbqcU4PJWZB4hHLPkVCB68ZjdwXV1E'.Exception: System.NullReferenceException: Object reference not set to an instance of an object. at......"
Код: Выделить всё
FilteredUsers = new List();
string filterValue = e.Value.ToString();
foreach (var user in Users)
{
if ((user.FirstName != null && user.FirstName.Contains(filterValue, StringComparison.OrdinalIgnoreCase)) ||
(user.FirstLastName != null && user.FirstLastName.Contains(filterValue, StringComparison.OrdinalIgnoreCase)))
{
FilteredUsers.Add(user);
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... m-on-azure