warum nicht? Mit dem wäre das Problem schon gelöst.
Das Backend hat einen kleinen Funktionsumfang und muss relativ häufig installiert werden (Jedes mal liegt eine andere Datenbank mit Benutzern dahinter). Um den Aufwand möglichst gering zu halten, wurde sich damals für das Paket AspNet.Security.OpenIdConnect.Server entschieden, was mit dem Backend ausgeliefert wird.
Außerdem würde ein für sich laufender IdentityServer die Ausfallsicherheit nicht besonders erhöhen, da nun lediglich der IdentityServer ausfallen müsste, um die Applikation unbrauchbar zu machen.
Zitat
warum nicht? Mit dem wäre das Problem schon gelöst.
Der IdentityServer würde ein Token ausstellen und ich würde in der Web API den IdentityServer als Issuer eintragen. Woher wissen die einzelnen API´s, das dass Token gültig ist? Ich nehme an, der IdentityServer muss nicht bei jedem Request gefragt werden.
Ich durchsuche gerade die Spezifikation des OpenID Connect Protokolls um eine Antwort zu finden. Allerdings wird es mir noch nicht 100% klar.
Zitat
Hast du dann bei deiner OpenId-Variante ein Authentifizierung gegen was?
Die Applikation läuft stets in einem internen Netzwerk und die Credentials werden gegen eine Datenbank geprüft. Es ist quasi ein Resource Owner Password Credentials Flow.
was ist der übliche Weg um einen REST-Service mit Token-Authentifizierung zu skalieren?
Ich muss natürlich sicherstellen, dass ein Benutzer mit jedem Backendseitigem Service sprechen kann, egal bei welchem er sich angemeldet hat.
Daher muss das Token von jedem Service für gültig gehalten werden.
Es wird zurzeit kein eigenständiger IdentityServer eingesetzt, sondern eine relativ kleine Bibliothek: ASP.NET.OpenId die in der eigentlichen Applikation sitzt.
Was habe ich nun für Möglichkeiten?
1) Token auf Basis eines festen Zertifikats erstellen. Das Zertifikat bekommt dann jede Instanz des Services und sollte so kompatible Tokens erzeugen
2) Ich habe ansetze mit Redis als "Key-Store" gesehen
Da es sich vom eigentlichen ADO.NET Kommunikationparadigma unterscheidet, ist es für mich in diesem Sinne schon ein Bug; egal was die andere Seite als Grund darstellt.
Demnach hatte ich mich richtig erinnert, dass dies z.B. beim SQL-Server nicht zu Problemen führt?
Wechsel der Datenbank ist leider keine Option.
Ich werde mal mit der Lifetime der Connections hantieren und im Notfall Richtung eigenem Connection-Pooling testen.
Wir schicken dann die standardisierten XLIFF Exporte (falls nötig) an ein Übersetzungsbüro und müssen dann nur die bearbeitete Datei einbinden. Zugriff auf die übersetzten Texte erfolgt dann über die Ressourcen-Dateien.
Auch automatische Übersetzungen sind möglich, aber die bewegen sich meist auf google translator Niveau.
könntest du nochmal genauer erklären inwiefern die Usersecrets helfen?
Ich hatte es so in Erinnerung, dass die Usersecrets im "Benutzer-Ordner" abgelegt werden und so zum Beispiel verhindert wird, dass diese mit eingechecked werden.
Eine Verschlüsselung würde demnach nicht dahinter stecken.
Es ist also eher eine Absicherung während dem Entwicklungsprozess und keine ConnectionString Verschlüsselung für den Relase-Build.
ich habe bisher perfmon genutzt um .NET Prozesse zu überprüfen. Es geht mir speziell um die GC-Abläufe. Ich habe gelesen, dass die Performancecounter bisher im .NET Core Bereich nicht vorhanden sind. Bedeutet dies, dass somit der perfmon zur Überprüfung rausfällt?
Gibt es alternativen, die ihr empfehlen würdet?
Lesen einer Excel-Datei --> Aufbereitung der Daten --> Update/Insert in DB --> Senden einer Status-E-Mail.
Ich habe mir einige Gedanken gemacht und bräuchte nun eure Hilfe.
Hier meine Gedanken:
Typisches Pipeline-Probleme --> Verwendung von TPL-Dataflow
Lesen der Datei außerhalb des "Dataflows"
Post in einen Transformlock für Aufbereitung der Daten
Weitergeben an einen ActionBlock für Update oder Insert
Meine Fragen:
1) Ich würde die einzelnen Datensätze pro Datei in Batchblöcke zusammenfassen und dann im ActionBlock parallel abarbeiten und pro "Batch" nur eine Transaction nutzen.
Wo fange ich an die Blöcke zu bilden? Bereits beim Einlesen der Datei? Dann hätte ich mehrere Posts in den TransformBlock pro Datei. Oder setze ich einen BatchBlock zwischen Transformer und Action? Allerdings müsste ich dann den BatchBlock hin und wieder manuell auslösen, da die Excel-Datei selten genau ein vielfaches der "Max-Size" des BatchBlocks haben wird.
Wie kann ich optimal bestimmten, wenn die Datei vollständig importiert wurde? Durch die Blockbildung wird dies komplizierter.
Oder sollte ich auf die Blockbildung und parallele Verarbeitung pro Datei verzichten?
2) Der ActionBlock ist mit dem Import momentan das letzte Glied im "Dataflow". Wie verfahre ich am besten mit der EMail? Die EMail kann entweder eine Erfolgsmelung oder eine Errormeldung enthalten. Sollte ich hier einen weiteren Block verwenden, oder das Versenden aus dem "Dataflow" herausnehmen? Eine Verarbeitung über eine kleine Warteschlange mithilfe der BlockingCollection wäre ebenfalls eine Möglichkeit.
Ihr seht ich bräuchte Hilfe bei einigen "Design-Entscheidungen".
ich habe mich die letzten Tage mit Docker beschäftigt und hätte eine Frage zu den Appsettings.
Als Beispiel ohne Docker: Ein Pfad (zum Beispiel zu einer Datenbank) ist in den Appsettings gespeichert. Ändert sich der Pfad, ist das kein Problem. Ich ändere entsprechend den Pfad in der Datei und bin fertig.
Bei Docker habe ich jetzt x alternativen alle mit Vor und Nachteilen.
Ich hatte anfangs nicht daran gedacht, allerdings dann hinzugefügt.
Funktionieren tut es aber nur, wenn das Hashset static ist. Woran liegt das?
Ohne static befindet sich die variable auf Instanz-Ebene und davon sollte es nur eine geben.
Erzeugt wird diese von Topshelf:
HostFactory.Run(config =>
{
// Pass it to Topshelf
config.UseSimpleInjector(_container);
config.UseNLog();
config.Service<Service>(s => //Service ist die Instanz
{
s.ConstructUsingSimpleInjector();
s.WhenStarted((service, control) => service.Start(control));
s.WhenStopped((service, control) => service.Stop(control));
});
config.RunAsLocalSystem();
});
Das ich das nicht verhindern kann, ist mir bewusst.
Deswegen habe ich versucht, das Problem mit dem Hashset zu umgehen. Allerdings ohne erfolg. Ich bekomme 2 Mal ein true zurück und am Ende ist der Pfad nur einmal drin.
Füge ich die Datei nun ein weiteres Mal hinzu, gibt es keine Probleme. Die events sind einfach zu kurz hintereinander.
Deabonnieren ist keine Option, da so potentielle andere Dateien übersehen werden.
Die Abfrage des booleschen Wertes müsste aber auf Dateiebene stattfinden. Da andere Dateien natürlich noch verarbeitet werden sollen. Ich denke ich werde hier ebenfalls das Problem haben, dass dies zu langsam ist.
Das Event habe ich nicht explizit abonniert.
ich habe ein kleines Problem mit dem Verhalten des FilesystemWatchers. Bekanntlich werden für eine Datei die Events häufig mehrfach gefeuert (Es geht nur um das OnCreated).
Ich würde das Event aber gerne nur einmal verarbeiten, bis die Datei wieder von mir "freigegeben" wurde.
Ich habe im Handler ein Hashset erstellt und füge den Pfad hinzu. Sollte das fehlschlagen, würde die eigentliche Aktion nicht ausgelöst werden.
Als alternative zu ILMerge wäre noch Costura.Fody zu empfehlen. Du installierst das Nuget-Package und bist fertig. Die kompilierte exe enthält sämtliche Abhängigkeiten und du brauchst die dll's nicht daneben liegen haben.
Eine Frage ist mir mittlerweile noch gekommen. Wie würdest du unterschiedliche Sprachen handhaben?
Die Services, die die Nachrichten über den Pushservice rausschicken möchten, wissen ja so erstmal nichts von der Client-System-Sprache und immer ist das vielleicht auch nicht möglich. In der Hand des Pushservices sollte dies wohl auch nicht liegen die Nachrichten zu "übersetzen".
Sollte das Übersetzen beim Client liegen, könnten nur standardisierte Nachrichten rausgeschickt werden wie zum Beispiel: "UploadStatusOk" wird zu "Datei erfolgreich hochgeladen" oder eben das ganze auf Englisch.
Ich drehe mich momentan ein wenig im Kreis. Vielleicht hättest du ja nochmal einen Tipp.
Ich habe es so verstanden, dass die Kommunikation (bzw. der "Kommunikationsstart") in beide Richtungen gehen soll, oder vertue ich mich? Demnach wäre SignalR die bessere Alternative.
Allerdings hat der JavaClient wohl ein paar Fehler und seit längerem wird nichts mehr daran gemacht: https://github.com/SignalR/java-client Aber vielleicht ändert sich das ja mit SignalR3 wieder.
Was auch immer 'video' ist, für mich sieht das so aus, als würdest du der Variabel immer nur ein Bitmap zuweisen?
void FinalVideo_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
if (stopVideo==true)
{
2) Erst wenn du das Video stoppst, wird video (1 Bitmap) dem AVIwriter hinzugefügt
video = (Bitmap)eventArgs.Frame.Clone();
AVIwriter.Quality = 0;
AVIwriter.AddFrame(video); //addd new frame to pend video file
}
else
{
1) video wird ein Bitmapt zugewiesen
video = (Bitmap)eventArgs.Frame.Clone();
}
}