Как использовать или использовать серверные SDK, не разработанные для параллелизма в ASP.NET Core 2.1 с страницами Razor

asp.net-core blazor c#

Вопрос

Обновление: согласно его запросу, более чистое объяснение того, чего я пытаюсь достичь, и описание контекста, в котором я работаю.

По сути, я делаю веб-сайт с использованием ASP.NET Core 2.1 с картой Razor Pages, полностью настроенной по умолчанию для всех. Важно отметить, что мне нужно использовать конкретного внешнего поставщика в качестве службы управления данными приложения и, следовательно, не может просто реализовать базу данных с помощью ASP.NET. Из-за этого в серверном коде для большинства страниц я использую клиентский SDK для упомянутой службы управления, потому что с ним легче взаимодействовать, чем с REST API. Проблема в том, что я столкнулся с проблемами параллелизма из-за того, что SDK был разработан для использования с одним сеансом за раз и, таким образом, предоставляет статические свойства, содержащие данные сеанса, такие как «текущий пользователь». Я спрашиваю, как я могу создать новый домен выполнения или памяти для каждого созданного сеанса, чтобы каждый мог иметь свой собственный «текущий пользователь» или как я мог иначе решить кошмар параллелизма, который возникает, когда SDK , который предназначен только для того, чтобы клиент имел дело с одним пользователем и / или сеансом за раз во всем бэкэнд. Мои предыдущие заметки о Blazor, где попытка описать самый простой аналог для того, что я думаю, может быть решением этой проблемы. Я слышал о хранении данных сеанса; однако, насколько мне известно, все должно быть сериализовано в JSON и где-то хранится в файле, что не работает для меня, поскольку данные могут быть конфиденциальными.

Старое объяснение (по-прежнему в некоторой степени релевантно): Я создаю веб-сайт, основанный на ASP.NET Core 2.1, и я пытаюсь использовать SDK, который был разработан для использования в AppDomain который уникален для одного конкретного экземпляра и / или сеанса приложения; это означает, что SDK имеет несколько API, которые предоставляют элементы хранения данных (поля, свойства и т. д.), которые являются статическими. С точки зрения использования такого SDK с ядром ASP.NET эта структура экспонирования кажется проблемой, поскольку среда выполнения распределяет только один AppDomain на стороне сервера для всех сеансов коллективно и, следовательно, может быть несколько отдельных пользователей, делиться. Если у меня нет доступа к источнику этого SDK и / или он не может быть изменен, для целей, связанных с платформо-агностицизмом, как я могу использовать SDK успешно, не имея возможности хранить данные только для одного сеанса за раз. Вот упрощенная версия того, с чем я работаю:

Пример API:

public sealed class User
{
    public static User ActiveUser { get; private set; } 

    public static int TotalLogCyclesThisSession { get; private set; } = 0

    public string Username { get; internal set; }

    private string Password { get; internal set; }

    public string Name { get; internal set; }

    public string AccessKey { get; }

    public User(string username, string password)
    {
        /* Populate Instance Properties with Relevant Data */

        ActiveUser = this;
    }

    public void Logout()
    {
        /* Clear Data from Settable Instance Properties */

        ActiveUser = null;
        TotalLogCyclesThisSession++;
    }
}

Предположим, что статические переменные используются в другом месте в SDK.

Таким образом, если бы API выше был реальным, как бы я использовал его в ядре ASP.NET, чтобы каждый сеанс имел свою собственную полную копию SDK для использования, включая статические переменные, зависящие от сеанса. Если возможно, я ищу что-то вроде того, как можно создать сборку Blazor «Клиент», которая имеет новый AppDomain для каждого сеанса и сборку «Сервер», хотя я понимаю, что решение, реализованное Blazor, может быть неприменимо учитывая, что он также имеет локальную рабочую среду браузера, а ASP.NET Core - нет. В худшем случае API может быть изменен, но он по-прежнему должен быть несовместимым с платформой для большинства экстентов. Заранее благодарим за помощь.

Популярные ответы

Мне трудно понять вашу проблему. Но я думаю, что проблема заключается в некоторой путанице в отношении Блазора, но исправьте меня, если я ошибаюсь.

«создайте сборку Blazor« Client », у которой есть новый AppDomain для каждой сессии»

Таким образом, Blazor - это клиентская SPA-платформа на .NET и запускает WebAssembly в браузере. Так что технически у вас нет классических «сеансов», нет сеансов cookie, ничего. И оборонительно не несколько, потому что весь контекст находится в памяти браузера, который используется одним пользователем. Подумайте о Blazor, как JS SPA, например, приложение Angular или React . SPA, обычно используемые с (без гражданства) API, которые могут быть разрешены или нет. Вы можете сделать то же самое здесь. Просто приобретите токен (OAuth2) и передайте его в свой API. Вот пример кода, который делает что-то похожее на пользовательский объект, чем вы спрашивали: UserModel.cs и здесь находится код авторизированного клиента ApiClient.cs .

Если вы хотите думать в «сеансах» и классическом. Технически сеанс находится в памяти браузера, состоянии SPA. Время жизни сеанса - это время окончания токена. Но это то же самое с каждым приложением SPA, если оно не JS или Blazor.

Надеюсь, это поможет и ответит на ваш вопрос.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow