So verwenden oder behandeln Sie serverseitige SDKs, die in ASP.NET Core 2.1 nicht für Parallelität mit Razor Pages konzipiert sind

asp.net-core blazor c#

Frage

Update: Auf die folgende Art und Weise ist eine genauere Erklärung dessen, was ich zu erreichen versuche, und eine Beschreibung des Kontexts, in dem ich arbeite.

Im Wesentlichen mache ich eine Website, die ASP.NET Core 2.1 mit dem Razor Pages-Framework verwendet und vollständig mit der Standardkonfiguration für alles konfiguriert ist. Der wichtige Hinweis ist, dass ich einen bestimmten externen Anbieter als Datenverwaltungsdienst der App verwenden muss und daher nicht einfach eine Datenbank mit ASP.NET implementieren kann. Aus diesem Grund verwende ich im serverseitigen Code für die meisten Seiten ein Client-SDK für diesen Verwaltungsdienst, da die Interaktion mit einer REST-API einfacher ist. Das Problem ist, dass ich auf Nebenläufigkeitsprobleme stoße, da das SDK für die Verwendung mit jeweils einer Sitzung konzipiert wurde und somit statische Eigenschaften verfügbar macht, die Sitzungsdaten wie den "aktuellen Benutzer" enthalten. Ich frage, wie ich möglicherweise für jede erstellte Sitzung eine neue Ausführungs- oder Speicherdomäne erstellen kann, so dass jeder seinen eigenen "aktuellen Benutzer" haben kann oder wie ich sonst den Nebenwahrscheinlichkeits-Albtraum lösen könnte, der bei einem SDK auftaucht Wird verwendet, um nur den Client mit einem Benutzer und / oder einer Sitzung gleichzeitig im gesamten Backend zu behandeln. Meine früheren Notizen über Blazor, wo ich versuchte, das einfachste Analog zu beschreiben, was ich denke, könnte eine Lösung für dieses Problem sein. Ich habe von der Speicherung von Sitzungsdaten gehört. Soweit mir bekannt ist, muss jedoch alles zu JSON serialisiert und irgendwo in einer Datei gespeichert werden, was für mich nicht funktioniert, da die Daten vertraulich sein könnten.

Alte Erklärung (immer noch etwas relevant): Ich erstelle eine Website mit ASP.NET Core 2.1 und versuche, ein SDK zu verwenden, das für die Verwendung in einer AppDomain , die für eine bestimmte Anwendungsinstanz und / oder Sitzung spezifisch ist. Dies bedeutet, dass das SDK über mehrere APIs verfügt, die Datenspeicherelemente (Felder, Eigenschaften usw.) verfügbar machen, die statisch sind. In Bezug auf die Verwendung eines solchen SDK mit ASP.NET Core scheint diese Expositionsstruktur ein Problem zu sein, da die Laufzeit auf der Serverseite nur eine einzige AppDomain für alle Sitzungen gemeinsam und somit möglicherweise mehrere separate Benutzer AppDomain Teilen. Wenn ich keinen Zugriff auf die Quelle dieses SDKs habe und / oder zu Zwecken der Plattform-Agnostizismus nicht geändert werden kann, verwende ich das SDK erfolgreich, ohne die Daten jeweils nur für eine Sitzung speichern zu können. Hier ist eine vereinfachte Version von dem, mit dem ich arbeite:

Beispiel-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++;
    }
}

Angenommen, die statischen Variablen werden auch an anderer Stelle im SDK verwendet.

Wenn also die obige API real wäre, wie würde ich sie in ASP.NET Core verwenden, so dass jede Sitzung ihre eigene gesamte SDK-Version verwenden würde, einschließlich sitzungsspezifischer statischer Variablen. Wenn möglich, suche ich nach etwas wie, wie es möglich ist, eine Blazor "Client" Assembly zu erstellen, die eine neue AppDomain für jede Sitzung und eine "Server" Assembly hat, obwohl ich weiß, dass die von Blazor implementierte Lösung nicht anwendbar ist wenn man bedenkt, dass auch eine browserlokale Laufzeit aktiv ist, während dies bei ASP.NET Core nicht der Fall ist. Worst-Case-Szenario, die API kann geändert werden, aber es muss immer noch weitgehend plattformunabhängig sein. Vielen Dank im Voraus für alle Hilfe.

Beliebte Antwort

Ich habe Schwierigkeiten, Ihr Problem zu verstehen. Aber ich denke, das Problem ist etwas Verwirrung über Blazor, aber korrigieren Sie mich, wenn ich falsch liege.

"Erstellen Sie eine Blazor" Client "-Assembly, die für jede Sitzung eine neue AppDomain enthält"

So ist Blazor ein Client-seitiges SPA, das auf .NET aufbaut und WebAssembly im Browser ausführt. Technisch gesehen haben Sie also keine klassischen "Sessions", keinen Session-Cookie, nichts. Und defensiv nicht mehrere, weil der gesamte Kontext im Browserspeicher ist, der von einem einzelnen Benutzer verwendet wird. Denken Sie an Blazor wie ein JS SPA zB Angular oder React App. SPAs werden normalerweise mit (zustandslosen) APIs verwendet, die autorisiert werden können oder nicht. Sie können das gleiche hier tun. Erwerben Sie einfach ein Token (OAuth2) und übergeben Sie es an Ihre API. Hier ist ein Beispielcode, der etwas ähnliches mit einem Benutzerobjekt tut, als Sie gefragt haben: UserModel.cs und hier ist der Autorisierte Client ApiClient.cs Code.

Wenn Sie in "Sitzungen" und dem klassischen Weg denken möchten. Technisch befindet sich die Sitzung im Browserspeicher, SPA-Status. Die Lebensdauer der Sitzung ist die Ablaufzeit des Tokens. Aber es ist das gleiche mit jeder SPA-Anwendung egal ob es JS oder Blazor ist.

Ich hoffe, das hilft und beantwortet Ihre Frage.




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum