Laden...

Forenbeiträge von Papst Ingesamt 441 Beiträge

10.09.2020 - 16:01 Uhr

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.

08.09.2020 - 21:26 Uhr

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.

08.09.2020 - 21:20 Uhr

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.

31.08.2020 - 15:16 Uhr

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

26.08.2020 - 15:25 Uhr

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.

25.08.2020 - 17:01 Uhr

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.

12.08.2020 - 18:12 Uhr

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.

01.08.2020 - 12:14 Uhr

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, ...)

29.07.2020 - 13:24 Uhr

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.

28.07.2020 - 22:00 Uhr

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:

  • Warum VPN? Stark Authentifizierte (z.B. https) Verbindungen können eine leichtgewichtige Alternative sein, die auch auf Mobilgeräten funktionieren.
  • Warum Fileshares?
24.07.2020 - 14:21 Uhr

Hast du an das einfachste Gedacht?

Wie sieht denn die Bookmark aus? Ist das vielleicht der Redirect zum Identity Provider?

18.07.2020 - 17:23 Uhr

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

10.07.2020 - 14:24 Uhr

Dann sollte definitiv eine HTTP API dazwischen!

Die Datenbank sollte nicht über das Internet erreichbar sein!

09.07.2020 - 15:23 Uhr

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.

08.07.2020 - 16:34 Uhr

Am besten: Gar nicht 😃

Deine Desktop Applikation sollte keinen direkten Datenbank Zugang haben, sondern die Daten von einem Webservice konsumieren.

05.07.2020 - 02:33 Uhr

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.

02.07.2020 - 21:43 Uhr

In erster Linie geht es um das separieren der Logik.
Dass du einmal implementierte Commands doppelt nutzen kannst ist aus meiner Sicht ein Nebeneffekt.

30.06.2020 - 22:43 Uhr

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.

17.06.2020 - 19:17 Uhr

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

08.06.2020 - 19:32 Uhr

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.

07.06.2020 - 13:10 Uhr

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.

07.06.2020 - 12:53 Uhr

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.

31.05.2020 - 10:56 Uhr

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.

21.05.2020 - 18:17 Uhr

@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#

21.05.2020 - 14:46 Uhr

Du könntest das mit einem Dictionary machen.


class Root {
 public Dictionary<string, Mirror> Container { get; set; }
}

20.05.2020 - 17:37 Uhr

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.

05.05.2020 - 20:49 Uhr

Was fehlt dir?
Eine DataSource mit allen möglichen Monaten? --> die wirst du dir selber erstellen müssen.

27.04.2020 - 21:57 Uhr

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.

27.04.2020 - 21:36 Uhr

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.

23.04.2020 - 22:08 Uhr

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.

23.04.2020 - 19:56 Uhr

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

23.04.2020 - 19:45 Uhr

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

13.04.2020 - 23:30 Uhr

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

09.04.2020 - 22:55 Uhr

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.

05.04.2020 - 19:37 Uhr

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.

05.04.2020 - 14:15 Uhr

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.

02.04.2020 - 21:11 Uhr

Was hast du denn bisher versucht?

So als Ansätze (weiß allerdings nicht ob die gut sind 😃):

  • Du könntest ein SVG erstellen und rendern
  • Du könntest mithilfe des <Path> Controls etwas zeichnen
  • Du könntest 4 Bilder eines Kartons erstellen und darstellen
31.03.2020 - 14:23 Uhr

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.

31.03.2020 - 13:57 Uhr

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.

29.03.2020 - 16:55 Uhr

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

29.03.2020 - 16:37 Uhr

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

26.03.2020 - 10:14 Uhr

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

26.03.2020 - 09:34 Uhr

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.

26.03.2020 - 08:28 Uhr

Die Directory Klasse bietet an sich alles, was du für die Arbeit mit Ordnern und Dateien benötigst.

18.03.2020 - 19:16 Uhr

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.

17.03.2020 - 20:42 Uhr

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.

17.03.2020 - 18:33 Uhr

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.

17.03.2020 - 18:16 Uhr

Alternativ bieten sich auch Produkte wie Teamviewer an.

10.03.2020 - 20:08 Uhr

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