Как использовать или работать с серверными SDK, не предназначенными для параллелизма в ASP.NET Core 2.1 с бритвенными страницами - PullRequest
0 голосов
/ 23 июня 2018

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

По сути, я делаю сайт, используя 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 Core, эта структура подверженности, по-видимому, является проблемой, поскольку среда выполнения выделяет только один 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 Core, чтобы у каждого сеанса была своя собственная полная копия SDK, включая статические переменные, специфичные для сессии. Если возможно, я ищу что-то вроде того, как можно создать «клиентскую» сборку Blazor, которая имеет новый AppDomain для каждой сессии и «серверную» сборку, хотя я понимаю, что решение, реализованное Blazor, не может быть применимыми, учитывая, что у него также активна локальная среда выполнения браузера, а в ASP.NET Core нет. В худшем случае API может быть изменен, но он все равно должен быть независимым от платформы для большинства экстентов. Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 28 июня 2018

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

"создать сборку Blazor" Client ", в которой для каждого сеанса есть новый домен приложений"

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

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

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

...