Hi,
wenn du sagst du erzeugst deine Proxies selber auf Basis der Metadaten, wirst du ja in den Proxies eien HttpClient verwenden.
Dieser behandelt deinen Http Request auf deine OData API. Hier solltest du auch an die Fehlerbeschreibung kommen.
Ohne das jemals mit ASP.NET gemacht zu haben, einfach mal frei heraus mit meinem Halbwissen 😃.
In deinen Settings ist der ResponseType nicht gesetzt. Würdest du den auf "code" bzw auf OpenIdConnectResponseType.Code setzt, sollte das AAD mit der passenden Antwort um die Ecke kommen.
Hi,
das ist leider echt schlecht vergleichbar. Bei der Cosmos DB bezahlst du ja nicht für expliziten RAM oder eine CPU, sondern für Request Units.
Auch ist ein Vergleich mit nur einem enthaltenen Dokument denkbar schlecht, du bezahlst die Cosmos DB glaube ich in vollen GB.
Ob es im Produktiven Anwendungsfall lohnt muss glaube ich dabei sehr genau angeschaut werden können. Ich muss dann ehrlich gestehen, dass ich nicht weiß inwie weit MongoDB Atlas Feature-gleich mit der Managed Cosmos DB ist.
Im Endeffekt sitzen ja dort bei MS Produktmanager, die sehr genau im Markt vergleichen werden, was für solche Datenbanken für Preise ausgerufen werden können.
SSH bietet sich idr. nicht zum monitoren von Switchen an. Genau dafür gibt es das Protokoll SNMP.
Wir verwenden hier die Lextm.SharpSnmpLib sehr erfolgreich in der freien Version. Zusammen mit den Python tools "pysmi" unter Linux lassen sich da sehr elegant auch die MIB Files auslesen und die entsprechenden Datenpunkte (Object ID's) bestimmen.
Edit: pysmi eingefügt, sonst machte der Satz keinen Sinn
Denkt bitte an die Regelung eine Frage pro Thread.
Jeder Datentyp kann nullbar gemacht werden, durch ein
Nullable<DateTime>
oder
DateTime?
.
Fraglich ist, ob das notwendig ist, aber das ist von Fall zu Fall zu entscheiden.
Du kannst in .Net Core mit WPF genauso MVVM machen, wie ich .Net Framework.
Toolbox klingt sehr nach Windows Forms.
Wenn du die Konfigurationsoberfläche für den Serialport suchst, die wirst du in WPF selber bauen müssen.
Ansonsten die Klasse System.IO.SerialPort bei einem .Net Framework Projekt direkt verfügbar sein und bei einem .Net Core Projekt über NuGet verfügbar sein.
Selbst wenn du die DLL unter Ubuntu hättest würde das nicht funktionieren.
Wenn du das nicht anders kapseln kannst (auf der Gegenseite) wirst du vermutlich etwas mit Samba unter Ubuntu machen müssen.
Sofern die Verbindungstests deinen Anforderungen genügen und funktionieren kann man das so machen.
Allerdings solltest du das wie du es machst noch einmal überarbeiten.
-> Trenne Logik von UI [Artikel] Drei-Schichten-Architektur
-> Beim prüfen von Exception Strings bedenke, dass diese nur bei dir auf Deutsch sein könnten. Bei jemanden mit einem englischen Sprachpaket (OS) sind diese auf Englisch
-> Nutze keine "Magic Strings" zum kommunizieren, das ist UI Aufgabe, nicht Logik. Das lässt sich so z.B. nicht lokalisieren. Nutze z.B. Enums oder Ereignisbasierte "Benachrichtigungen"
-> Methoden können Rückgabewerte haben, dadurch kannst du dann später Wiederverwendbarkeit steigern.
Ich hätte vermutlich ein Interface definiert IConnectionTester o.ä. und dann davon drei Implementierungen bereit gestellt, je eine für SQL, WebDav und HTTP.
Denn die Intention und die Rückgabe sind exakt diegleichen, nur die Transportverbindung nicht. Damit hättest du es auch später einfacher, wenn du weitere Dienste testen willst (z.B. FTP oder SSH, ...)
Wie du siehst ist das gar nicht so einfach zu beantworten und VPN ist nicht deine Anforderung, sondern eine technische Lösung um etwas zu erreichen.
Es macht in jedem Fall Sinn, dir wirklich über deine Anforderungen klar zu werden und dann dich nach Möglichkieten der Implementierung umzuschauen und dich hier ggf. beraten zu lassen anstatt blind auf eine Möglichkeit loszulaufen.
Das kommt immer auf deine genauen Anforderungen an.
Und ein Forum kann dir da keine Beratung durch Experten ersetzen, die deine Anforderungen analysiert.
Es gibt, gerade für Fileshares andere sinnvolle Alternativen.. z.B. Sharepoint Online/Onedrive for Business.
Fragen, die du dir stellen solltest:
Hast du an das einfachste Gedacht?
Wie sieht denn die Bookmark aus? Ist das vielleicht der Redirect zum Identity Provider?
Der Vollständigkeit halber: WebClient ist veraltet, nutze den HttpClient.
Steht auch in der Dokumentation zum WebClient: https://docs.microsoft.com/en-us/dotnet/api/system.net.webclient?view=netcore-3.1
Am einfachsten setzt du alle Einstellungen zurück.
https://docs.microsoft.com/en-us/visualstudio/ide/reference/resetsettings-devenv-exe?view=vs-2019
Dann sollte definitiv eine HTTP API dazwischen!
Die Datenbank sollte nicht über das Internet erreichbar sein!
Die Where() Erweiterungsmethode gibt keine Observable Collection wieder, sondern einen Enumerable<T> (im weitesten Sinne).
Wenn du davon eine Kopie(!) als ObservableCollection haben willst, müsstest du den Enumerable an den Konstruktor einer ObservableCollection übergeben: https://docs.microsoft.com/en-us/dotnet/api/system.collections.objectmodel.observablecollection-1.-ctor?view=netcore-3.1
var collection = new ObservableCollection<Model>(_liste.Where(... bedingung ...));
Das erzeugt wie gesagt eine Kopie der Liste (aber idr. keine Kopie deiner Objekte).
Natürlich stimmt mein Einwand mit "immer eine API nutzen" nicht in allen Fällen - aber ich würde behauptden, dass es in 99,9% sinnvoller ist, eine API und ggf. eine zentralisierte Datenbank als ein lokales(!) DBMS zu nutzen.
Bei lokalen Datenbanken bietet sich meistens an eine einbettbare Datenbank (wie z.B. SQLite) zu nehmen. Das raubt auch dem Rechner keine Ressourcen durch einen dauerhaft laufenden Daemon.
Bezüglich Services, Interfaces usw. kann ich nur Empfehlen, dass du dich mit den Grundlagen auseinanderzusetzen und in dem Zuge kannst du dir gleich das Dependency Injection (z.B. am Beispiel des von MS mit .NET Core mitgelieferten Framework) und das Repository Pattern anschauen.
Am besten: Gar nicht 😃
Deine Desktop Applikation sollte keinen direkten Datenbank Zugang haben, sondern die Daten von einem Webservice konsumieren.
Ich bin mir nicht sicher, ob ein Style in beide Richtungen funktioniert.
Siehst du denn im Output Binding Fehler?
Das Datagrid sollte ein Event "RowSelected" o.ä. haben, das könntest du mit einem Command verbinden.
In erster Linie geht es um das separieren der Logik.
Dass du einmal implementierte Commands doppelt nutzen kannst ist aus meiner Sicht ein Nebeneffekt.
Events in MVVM behandelst du mit Commands.
Das OnClick Event bei z.B. einem Button kannst du direkt mit einem CommandBinding abfangen. Bei den anderen Events muss man etwas drum herum bauen (leider).
Im .Net Framework gab es daür das Paket System.Windows.Interactivity. Wie das bei .Net Core aussieht weiß ich nicht aus dem Kopf - aber vermutlich ähnlich.
In dem Zusammenhang hatte ich einmal Probleme mit zwei Dingen:
-> Zeitstempel im Container (unter Windows vor allem sehr schwierig: issue auf GitHub)
-> DNS Server IP fehlt dem Container
Oberhalb des publish Verzeichnisses liegt das, was beim kopilieren der App erzeugt wird.
Sinnvollerweise muss das ja auch irgendwo sein 😃
Übrigens, liegt das nur dort, wenn ich das standard publish Verzeichnis wähle.
Gebe ich ein anderes an, liegt dort nur die fertig App.
C:\Users\marco\source\repos\temp\BlazorApp1\BlazorApp1> rm -force -recurse bin
--> bin verzeichnis weg
C:\Users\marco\source\repos\temp\BlazorApp1\BlazorApp1> dotnet build -c release
--> bin/Release/netstandard2.1/ voll mit kompilat
C:\Users\marco\source\repos\temp\BlazorApp1\BlazorApp1> rm -force -recurse bin
--> bin verzeichnis weg
C:\Users\marco\source\repos\temp\BlazorApp1\BlazorApp1> dotnet publish -c release
--> bin/release/netstandard2.1/ voll mit kompilat
--> bin/release/netstandard2.1/publish/ beinhaltet App
C:\Users\marco\source\repos\temp\BlazorApp1\BlazorApp1> dotnet publish -c release -o c:\tmp
--> c:\tmp hat den Inhalt wwroot & web.config
Gleiches passiert auch, wenn ich per VS FolderProfile Publish Profil irgendwohin publishe.
Es gibt zehntausende Artikel, die beschreiben, wie man eine solche APi am besten aufbaut.
Nutzt du ASP.NET Core oder ASP.NET?
Wenn du die Möglichkeit hast, solltest du versuchen auf ASP.NET Core zu setzen.
Die Action könnte ungefähr so aussehen:
public async Task<IActionResult> GetAll()
{
var pages = await _repository.GetAllAsync();
return Ok(pages.ToDictionary(p => p.URL, p => new PageDescription {
PageName = p.Name,
[...]
}));
}
Besser: *kapsele das Mapping (.ToDictionary), dann wird der Code lesbarer. Entweder in eine eigene Methode oder in eine Bibliothek wie AutoMapper. *Nutze nicht ToDictionary sondern ein eigenes Objekt
Generell davon ein Dictionary zurückzugeben, kann ich weder ab- noch dazuraten. Best practises gibt es im Internet bestimmt ausreichen oder jemand mit mehr API Erfahrung kann hier etwas dazu schreiben.
Ich würde es vermeiden, wenn es geht.
Die geschweiften Klammern beschreiben ein Objekt, die eckigen ein Array.
Du musst also deine Daten transformieren, bevor du sie zurück gibst.
Die Daten können zwischen API und Datenbank durchaus ganz unterschiedlich aussehen.
Wenn du die Daten in das Format bringen willst, könntest du ein Dictionary<string, T> verwenden.
Ich persönlich würde bei EF nicht mit Vererbung arbeiten, sondern lieber mit optionalen 1:1 Entitäten oder sogar noch einer Abstraktionsebene mehr (je nach deinen Anforderungen).
Ich hatte das einmal in einem Projekt und es macht es unheimlich schwierig die Datenbank "von Hand" anzuschauen, weil - je nach gewählten Schema für die Vererbung - mehrere Tabellen entstehen.
Ich weiß aktuell nicht einmal ob EFCore Vererbung schon kann.
Bei Optionalen 1:1 Entitäten könntest du für jede Funktion (Rollen) eine eigene Entität anlegen und diese auf ein Mitglied referenzieren lassen. Das hätte den Vorteil, wenn mal jemand zwei Funktionen (Rollen) hat, du dies auch abbilden kannst.
Ob das so notwendig und richtig ist, hängt natürlich von deinen Anforderungen ab - das kannst du nur selber beantworten - wenn du keine Eigenschaften hast, die nur ein Lehrer hat, ist das so ggf. nicht sinnvoll.
@Coder007: der Compiler kennt die Zielplattform nicht, deswegen kann er das nicht alleine.
Anders als bei z.B. C wird nicht Maschinencode erzeugt beim kompilieren von C#
Du könntest das mit einem Dictionary machen.
class Root {
public Dictionary<string, Mirror> Container { get; set; }
}
Wenn du - wie im ersten Kommentar - selber eine Datei verschlüsselst, was machst du mit dem Schlüssel für die Datei?
Das verschiebt dein Problem nur ein Stückchen weiter.
Der Credential Manager ist an das Benutzerkonto des angemeldeten Benutzers gebunden. Das verschiebt das Problem natürlich auch nur, dafür aber an die Anmeldung des Benutzers.
Was fehlt dir?
Eine DataSource mit allen möglichen Monaten? --> die wirst du dir selber erstellen müssen.
Richtig, ich bin eigentlich davon ausgegangen, diese Beschränkung im Container nicht zu haben (warum auch immer ich auf diese Idee kam - vermutlich, weil Kestrel problemlos Port 80 öffnen kann 😃 ) und wurde eines besseren belehrt.
Problem noch nicht gefunden, aber zumindest eine Lösung. Highports funktionieren.
Es scheint also eine Limitierung zu sein, dass der Kernel/OS (so genau kenne ich mich, vor allem bei Linux, in den Schichten nicht so aus) das Socket öffnen verhindert.
Interessanterweise gibt es keine Exception.
Die Docker Logs geben leider nur die Logausgaben der eigenen Software her, von dort habe ich schon den genauen Punkt (also .Start()) herausgefunden.
Der Server im Container horcht jetzt auf 105021502, das wird dann von Docker auf 502 gemapped. Funktioniert.
Hi,
das mit Kestrel kenne ich tatsächlich. Ich verwende allerdings einen fertigen Protokollstack, der auf TcpListener aufbaut.
Die Option wäre dafür gewesen entweder einen Interop Layer oder einen eigenen Protokollstack zu entwickeln (bzw. zu der Lib beitragen).
Es handelt sich dabei um Modbus/TCP mit der Lib NModbus.
Vorhin kam mir noch die Idee, dass ein Problem des OS sein könnte.. dass ich auf Linux (--> im Container) mit einem normalen Prozess nicht den Port öffnen darf.
Hallo zusammen,
ich bin aktuell etwas ratlos, vielleicht hat das einer von euch schon einmal ähnlich erlebt.
Ich habe eine Applikation, die im untersten Level für den Transport einen TcpListener verwendet um einen Server zu stellen.
Dabei habe ich ein klassisches Works on my machine Problem:
Ich rufe TcpListener.Start() auf, das läuft im Debug oder in Release auf der Entwicklungsmaschine sauber durch und er baut danach den Server auf.
Lasse ich das ganze als Docker paketieren und auf der gleichen Maschine in einem Container laufen, blockiert er in der Ausführung innerhalb des .Start() aufrufes (also lange vor einem AcceptClient, dass innerhalb der Anwendungsschicht in einer Lib läuft)... sonst haben andere Entwickler immer nur bei AcceptClient die Probleme 😃
VG
Papst
Du kannst das in C# genau so machen. Du musst lediglich dafür sorgen, dass du Interpolationen und Zeilenumbrüche in Strings haben darfst.
-> Interpolation geht mit $
-> Zeilenumbrüche mit @
int variablen = 15;
string multiLineInterpolation = @$"hallo
ich kann
mehrere zeilen und {variablen} oder auch {(variablen == 15 ? true : false)} Ausdrücke enthalten";
Wobei die Element Erzeugung per Objekt deutlich sauberer ist, als XML Code im Quellcode zu haben und diesen zur Laufzeit zu parsen. Dann lagere ihn lieber in eine extra Datei aus.
Abt hat mal was zu XML gebloggt, bezüglich XDocument vs. XmlDocument: https://schwabencode.com/CSharp/CSharp-XML-Tutorial
Das könnte verschiedene Ursachen haben, z.B. könnte der HTML DOM durch JavaScript manipuliert werden, was der WebClient nicht mitbekommt, denn dieser kann lediglich HTTP Requests durchführen.
Vergleiche doch einmal den Output von curl auf die Zielseite mit dem, was der WebClient für dich herunterlädt.
Sollte das gleich sein liegt es nicht an deinem Code, sondern daran dass an der Website nachträglich der DOM geändert wird.
P.S.: WebClient gilt als veraltet. HttpClient ist sinnvoller zu nutzen
WPF verfügt über Validierungsstrategien in Zusammenhang mit Databinding.
Das würde dir einiges an Arbeit abnehmen und die Arbeit mit der UI konsistenter machen.
Ein Client ist nicht verbunden in dem Sinne.
Bei HTTP gilt, die Verbindung des Clients ist ein Request. Danach ist er nicht mehr verbunden.
Scoped lebt über genau einen Request. Innerhalb eines Requests bekommst du immer die gleiche Instanz der Klasse.
Bei Transient bekommst du jedes mal eine neue Instanz.
Das kannst du nur sicher sagen, solange die Datei nur auf deinem System war.
Wenn sie über verschiedene Systeme gegangen ist ist das "Erstellungsdatum" des Dateisystems nicht mehr zuverlässig. Vor allem dann, wenn es über unterschiedliche Dateisysteme gegangen ist.
Was hast du denn bisher versucht?
So als Ansätze (weiß allerdings nicht ob die gut sind 😃):
Ich habe jetzt das Video nur überflogen, aber wie es aussieht wird da vom WPF Client direkt auf die datenbank zugegriffen, was durchaus als Bad Practise bezeichnet werden muss.
Ziel sollte es sein, niemals direkt mit einer Applikation die im Dunstkreis eines Endusers läuft auf eine Datenbank zuzugreifen.
--> Abstraktion über eine API (das kann HTTP mit REST sein, gRPC, ....) das erlaubt dann eine granulare Kontrolle über das, was in der Datenbank ausgeführt wird und benötigt nachher keine Datenbankcredentials auf dem Client PC.
Bei uns ist auch Homeoffice angesagt, soweit es geht.
Die Produktion (Geräte, keine Software 😃) läuft soweit weiter, es wurde die Reinigung der Flächen erhöht und Sorge getragen, dass die Kollegen zwei Meter Abstand halten können, Pausenregelungen, Kantinenregelungen usw. wurden entsprechend auch verabschiedet.
Wirtschaftlich merken wir wohl etwas aber scheinbar nichts besorgniserregendes, sonst hätte es eine AdHoc Meldung für die Börse gegeben.
Hi,
schau nochmal, was ich geschrieben habe 😃
In der Regel [...] verbindet man eine Client Applikation niemals direkt mit der Datenbank, sondern setzt einen Abstraktionslayer (idr eine WebAPI) dazwischen.
und nur der Vollständigkeit halber ist eine WebAPI nicht der Weisheit letzter Schluss, es gibt hierfür auch andere Technologien, wie z.B. gRPC
Hallo DerMax,
die Frage ist, was genau du erreichen möchtest.
In der Regel (Ausnahmen wären z.B. Datenbank Administrationstools wie z.B. SQL Server Management Studio) verbindet man eine Client Applikation niemals direkt mit der Datenbank, sondern setzt einen Abstraktionslayer (idr eine WebAPI) dazwischen.
Für die WebApi gibt es gängige Authentifizierungsmethoden, die dir dann diese Arbeit abnehmen.
Edit als Hintergrundinfo:
Das ganze macht man aus Sicherheitsgründen:
*damit niemand die direkten Datenbankzugangsdaten kennt/kennen muss
*damit man genau kontrollieren kann, was auf der Datenbank passiert
*damit die Datenbank nicht öffentlich erreichbar sein muss
*damit man die etablierten Sicherheitsmechanismen, die auf dem http Protokoll aufbauen nutzen kann
Ich würde sagen nein und das aus Gutem Grund!
Benutze Google, du wirst nicht der/die erste mit diesem Problem sein.
Es gibt sogar etwas inden MS Docs dazu: https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/creating-an-explorer-style-interface-with-the-listview-and-treeview
visuelle Elemente, die dir Windows Forms bietet.
Z.B. einen Treeview. Ich bin nicht so firm, was Windows Forms angeht, aber es wird sicherlich auch Elemente, wie ein ListView geben.
Die Directory Klasse bietet an sich alles, was du für die Arbeit mit Ordnern und Dateien benötigst.
Definiere, was du unter Vergleichen verstehst und was der FTP Server unterstützt.
Wenn Vergleichen heißt, dass die Dateien auf Byte-Basis exakt gleich sein müssen bleibt nur herunterladen (oder hochladen) und vergleichen, sofern der Server keine Checksummen versteht.
Wenn Vergleichen aber für dich heißt, gleiche Größe und gleiches Änderungsdatum, dann kann das FTP sehr wohl leisten, denn die Informationen bekommst du bei einem Listing mitgeliefert.
Nein, aber du bekommst ein Komplett Produkt, zu dem du dir auch Support kaufen kannst und nicht alles alleine konfigurieren musst.
Gerade, wenn du nicht Experte für getunnelte Remote Verbindungen bist, baust du dir selber schneller einen offenen Angriffsvektor, als du chauen kannst.
C# Interactive könnte so funktionieren (oder ähnlich).
Du kannst auf deine Klassen und deren Methoden zugreifen und Zustände erzeugen.
Ob das aber so optimal ist kann ich nicht beurteilen - da habe ich nicht genug Erfahrung.
Alternative wäre auch PowerShell.
Alternativ bieten sich auch Produkte wie Teamviewer an.
In dem von mir verlinkten Artikel ist es gut beschrieben. Wenn du eine Schichtentrennung zwischen Datenhaltung und Datenpräsentation einführst und eigene Klassen in den Schichten hast, musst du zwischen diesen Klassen eine Projektion erzeugen.
Für die Projektion kannst du AutoMapper verwenden - musst es aber nicht.
Das Grundproblem (aber nicht die Lösung) ist, dass Entity Framework per default bei 1:n Verknüpfungen automatisch alle Datensätze mitlädt. Vermutlich ist, wenn dein Model gerendert wird, bereits die Datenbank Verbindung wieder geschlossen und damit können die Datensätze nicht automatisiert nachgeladen werden.
AutoMapper würde bei einer ausgeführten Projektion die Datensätze aber zugreifen wollen und diese damit nachladen (gesetzt dem Fall, du hast EFCore so konfiguriert, dass es das tut - ich bin aber nicht sicher, ob es das in der aktuellen Version überhaupt kann, ich habe das zum letzten mal in EF 6 benutzt).
Edit: verlinkt ist nicht gepostet - im Text korrigiert