Необычность серверных приложений Blazor, развернутых на размещенной виртуальной машине IIS в AzureC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Необычность серверных приложений Blazor, развернутых на размещенной виртуальной машине IIS в Azure

Сообщение Anonymous »

Я публикую это, чтобы помочь мне понять, что происходит за кулисами с моим кодом в серверном приложении Blazor. Как уже упоминалось, мое серверное приложение Blazor (приложение ниже) представляет собой, по крайней мере для меня, сложную смесь .razor, C# (классы, функции с HTML, модель и т. д.), JavaScript (нельзя отказаться от этого, если вы к сожалению, находятся в Интернете) и настойчивость.
В прошлом, будучи разработчиками, мы узнали, что среды разработки не всегда хорошо переносятся в производственные среды. Это изначальный аспект этой статьи, который я хочу изучить и понять больше. Проще говоря, необходимая конфигурация 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();
}
}
}
}
Эта служба должна использоваться как на страницах, так и в компонентах приложения, чтобы реализовать ее настолько хорошо, насколько позволяют мои навыки программирования новичка, чтобы обойти проблему EF Core Identity без UserManage. GetUsersAsync(). В приложении в файле StartUp.CS служба зарегистрирована как служба с областью действия Services.AddScoped();. На страницах и в компонентах сервис используется как:

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

@inject UserService US;



@code
{
protected override async Task OnInitializedAsync()
{
await US.LoadUsersAsync();
Users = US.Users;
}
... other code and functions ....
}
И хотя в большинстве случаев у меня нет проблем с загрузкой Users Async, проблема, которая определяет разницу в среде производства и разработки, заключается в том, что служба используется следующим образом с использованием LINQ:

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

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();
}
}
отлично работает в среде разработки, но когда приложение развертывается в IIS, оно возвращает ошибку:

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

"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......"
Проблема в том, что ошибка не возникает в разработке с тем же самым кодом. Все компилируется, запускается и работает как надо. Этот простой оператор LINQ пришлось заменить на следующий цикл, чтобы код работал в обеих средах:

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

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);
}
}
Может ли кто-нибудь помочь мне определить мою ошибку или причину проблемы, заключающейся в том, что код LINQ работает на одном компьютере с использованием Visual Studio 2022 со всеми исправлениями и .NET 8.0, а также на сервере, настроенном виртуальной машиной IIS? со всей необходимой конфигурацией серверного приложения Blazor в IIS плюс среда выполнения .NET 8.0 не работает? Любая информация сэкономит мне много часов разработки и отладки.

Подробнее здесь: https://stackoverflow.com/questions/791 ... m-on-azure
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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