Laden...

Forenbeiträge von Papst Ingesamt 441 Beiträge

17.04.2019 - 17:10 Uhr

verwendetes Datenbanksystem: PaaS SQL

Hallo zusammen,

wir verwenden einige SQL Datenbanken in Azure. Seitens unserer IT wurde jetzt für den SQL Server das Auditing aktiviert, so dass ich entsprechende Infos über mögliche Datenklassifizierungen in SQL Server bekomme.

Ehrlich gesagt habe ich mir um das Thema bisher keine Gedanken gemacht, ich denke aber dass es durchaus sinnvoll ist hier die passenden Spaltenattribute zu setzen.
Wie das theoretisch und praktisch "per Hand" funktioniert habe ich mir angeschaut (aus der Doku), würde das aber gerne entweder direkt an den POCO's von efcore oder mit einer Migration machen.

In der efcore doku habe ich weder etwas passendes auf Datenklassifizierung, noch auf etwas ähnliche wie "Custom Attributes" gefunden.
Hat jemand eine Idee, wie man das (ausser über einen Sql("...")) call in der Migration erledigen könnte?

01.03.2019 - 16:20 Uhr

Der Windows Explorer macht das beim erstellen einer Datei üer Kontextmenü -> Neu -> Textdatei

und zwar genau dann, wenn "Erweiterungen bei bekannten Dateitypen" in den Ordneroptionen aktiviert ist.

31.12.2018 - 12:52 Uhr

Du müsstest das Panel so definieren, dass es von der anderen Klasse aus zugegriffen werden kann.

Allerdings vermischt du dabei UI mit Logik Aufgaben. Besser wäre, du stellst von deiner Klasse aus eine Collection (z.B. ObservableCollection<T>) als Public Property zur Verfügung, auf dessen Änderung deine Form reagieren kann und das Panel neu rendert.
Die ObservableCollection<T> bietet dabei bereits Events an, die bei Änderung aufgerufen werden. Das hat den Nachteil, dass wenn du mehrere Sachen änderst, jedesmal das Panel neugeladen werden könnte. Daher wäre hier eine mögliche Lösung, eine normale Collection zu verwenden und ein eigenes Event zu definieren.

10.12.2018 - 19:53 Uhr

Ich würde mir ja mit Split('') ein Array erstellen

Das ist gar nicht notwendig, denn string ist bereits ein char-Array, dass man einfach iterieren kann.

26.11.2018 - 18:47 Uhr

Hi,

das hat etwas mit dem Unterschied von Referenz- und Werttypen zu tun. Für Werttypen, wie string einer ist, ist es einfach nicht vorgesehen soetwas zu machen.

Die einfachste Möglichkeit genau das zu erreichen, was du dort vorhast, ist mit einer Model Klasse zu arbeiten:


class ZeichenkettenModel 
{
   public string Zeichenkette { get; set; }
}


ZeichenkettenModel test = new ZeichenkettenModel();
test.Zeichenkette = "Hallo";

// Aufruf
new Testfenster(test);

Damit hast du eine Referenz, mit der du arbeiten kannst. Solltest du die Klasse dann noch einmal erweitern musst du nicht nicht einmal groß etwas erfinden um das zu tun - was bei der Übergabe von einem String allerdings notwendig wäre.

20.11.2018 - 19:16 Uhr

Hi,

danke für eure Meinungen. Ich werde wohl auf die Bulk Abfrage gehen, also:


var ids = input.Data.Select(x => x.Id);
Dictionary<Guid, Guid> idMap = await service.GetAllAsync(ids);

@Abt: Noch ist es keine HTTP Api, sondern ein EFCore Context, der im zweiten Schritt abgefragt wird.

19.11.2018 - 22:19 Uhr

Hi gfoidl,

du hast Recht, hier habe ich allerdings vorgesorgt. Der Service besteht aus zwei Services mit dem gleichen Interface, die sich gegenseitig aufrufen können. Der "vordere" fungiert dabei als Cache Proxy. Dieser hält die Informationen kurzzeitig vor, gerade weil ich Bursts dieser Anfragen erwarte und nicht auf die DB warten möchte.

Mir bleibt also die Wahl:
-> Frage alle Details der passenden Kategorie ab (fragt wesentlich mehr Daten als benötigt ab)
-> Frage explizit für die eingehenden Id's die "Id2" ab (im Bulk)
-> Frage async im Select ab

Architektonisch gefällt mir Option 1 am besten, ähnliche Abfragen habe ich schon, würde also der Linie treu bleiben.

19.11.2018 - 22:03 Uhr

Hmm, also den Service synchron programmieren oder mittels GetAwaiter().GetResult() ?

Ich wollte eigentlich gerne vermeiden synchrone Methoden in dem IO Belasteten Service anzubieten. Aktuell hängt da ein DB Call (ggf. mit Cache) dahinter, perspektivisch soll da ein HTTP Call zu einer API hinterhängen.

Würdest du den den Service so abändern, IEnumerable anstatt einer Id entgegennimmt und dann eine IDictionary zurückgibt, dass ich im Mapping verwenden kann?

19.11.2018 - 21:15 Uhr

Hallo zusammen,

ich möchte gerne ein Objekt um weitere Informationen anreichern. Dafür verwendet ich ein Mapping mittels LINQ:


var t = item.Select(async x => new { x.Id, x.Value, Id2 = await service.GetAsync(x.id) });

Mein Problem gerade: Von welchem Typ ist t? --> t ist IEnumerable<Task<anonymous>>
Das ist etwas unpraktisch, denn wenn ich an die Datenobjekte herankommen möchte müsste ich


var result = Task.WhenAll(t);

machen.

Gibt es da nicht eine elegantere Lösung? SelectAsync() wäre schön 😄.
Auf Stackoverflow gibt es noch Vorschläge mit der .Result Property, das würde ich gerne vermeiden.

18.11.2018 - 19:07 Uhr

Hi,

wenn du den Wert bereits als double hast, kannst du ihn einfach teilen. Das was du da hast ist ein Fix-Komma-Wert, also ein Wert der an einer bestimmten Stelle ein Komma hat, das aber nur per Definition dort ist:

1159.0 / 100 = 11.59

Was du auf jeden Fall beachten solltest ist, dass du ggf. einmal andere Werte als die erwartenden Zahlen in deinen Algorithmus bekommst, das solltest du abfangen (Was z.B., wenn dir jemand keine Zahlen sondern Buchstaben gibt).
Dafür bietet sich die Methode double.TryParse an.

P.S.: Wenn du die Wahl hast, ich würde keine Daten in die Nummern hineinkodieren, sondern diese separat in einer Datenbank pflegen. Spätestens, wenn sich mal etwas ändert musst du dann dein System nicht anpassen und weitere Parser erstellen.

18.11.2018 - 18:06 Uhr

Das liegt daran, dass "?=a" ein Array von Arrays mit unterschiedlichen Typen ist, du aber ein Array of SystemSeed daraus machen willst.
Entweder, du gehst da in mehreren Schritten heran (z.B. erst in ein Array deserialisieren und dann in ein Objekt verwandeln) oder schaust dir die JsonConverter von JSON.NET an.

18.11.2018 - 18:01 Uhr

Hi,

für eine GUI Applikation empfiehlt es sich immer auf das drei Schichten Architektur zu setzen. [Artikel] Drei-Schichten-Architektur

Vor allem bei länger laufenden Operationen (=> Datei einlesen, verarbeiten, speichern), bietet sich Nebenläufigkeit, also async an:
[FAQ] Warum blockiert mein GUI?

17.11.2018 - 14:00 Uhr

Hallo Norbert,

die Fehlermeldung sagt, dass du versucht einer Variable eines bestimmten Typs einen anderen, nicht kompatiblen zuzuweisen (Das ist wie Äpfel und Birnen vergleichen). Das sind Grundlagen.
Vielleicht hilft dir das weiter: [FAQ] Wie finde ich den Einstieg in C#?

Eine Collection ist dabei immer die Mehrzahl von dem eigentlichen Typ, deine Variable erwartet allerdings genau ein Control, nicht eine ControlCollection.

17.11.2018 - 10:05 Uhr

Hi,

so können wir dir fast nicht helfen.
-> Was funktioniert denn nicht?
-> Hast du mal mit dem Debugger ( [Artikel] Debugger: Wie verwende ich den von Visual Studio? ) geschaut, wie sich deine Zugriff auflösen, was die Objekte z.B. beim Aufruf von Controls["..."] zurückgibt?

14.11.2018 - 20:45 Uhr

Hi,

ich kenne mich mit WinForms nicht gut aus (in das Forum hätte es wohl auch besser gepasst), würde aber an deiner Stelle mal folgendes machen: Schau im Debugger, was für Möglichkeiten die dein SelectedItem bietet.
==> [Artikel] Debugger: Wie verwende ich den von Visual Studio?

Edit: Sorry, auf dem Schlauch gestanden... DataRowView ist eine View einer Zeile.. da müsstest du eigentlich mit ((DataRowView)SelectecItem)["Spalte"] an den Wert kommen.

P.S. das was du da baust ist eine riesige Sicherheitslücke, zum einen weil der Nutzer direkten Datenbankzugriff hat (ohne, dass du kontrollieren kannst, was er macht) und weil du die Tür für SQL Injection ganz weit aufmachst. Querys baut man nicht mit String Concat zusammen, sondern mit SQL Parametern.

10.11.2018 - 21:59 Uhr

Das TabControl wäre das richtige für den Anwendungsfall. Jedes Tab hat einen Header (ggf. mit eigenem Template) und jeweils einen Inhalt der dargestellt wird, wenn der Tab ausgewählt ist.

04.11.2018 - 12:46 Uhr

Tip: fange gleich mit an Sicherheit in deinem Konzept zu berücksichtigen. Später geht es vielleicht nicht mehr so gut und man lässt es dann weg.

Ich sehe an deinem Code nichts, wo du versuchst die POST Daten auszuwerten. Das wird vermutlich das Problem sein.

Du würdest es dir einfacher machen, wenn du anstatt des HttpListeners eine fertige Lösung nimmst, z.B. ASP.NET Core mit Kestrel oder NancyFx.
Du solltest dabei aber immer bedenken, dass privilegierte Ports (ich meine das ist alles unter 10k) nicht durch jeden Benutzer geöffnet werden kann. Wenn es doch HtppListener sein soll bietet Windows da eine Möglichkeit das unter Port 80 zu machen, mittels "Temporary Listen Addresses":


 $"http://+:80/Temporary_Listen_Addresses/{_redirectSubPath}/";

Das funktioniert aber meine ich ausschließlich lokal.

04.11.2018 - 12:14 Uhr

Um meine Fragen noch einmal zu konkretisieren:
-> Hast du Indizes auf den Datumsspalten in der MySQL
-> Wie lange dauert genau eine solche Anfrage, wenn du sie nicht über dein Programm, sondern über z.B. PHPMyAdmin laufen lässt (lokal auf dem Server)
-> Hast du einmal Zeiten gemessen? (Query Laufzeit direkt auf dem Server, vs. Laufzeit in deinem Programm)

Wenn du nur wissen willst, ob ein Tisch frei ist würde sich vielleicht eine COUNT() Abfrage anbieten, die die Reservierungen zählt, die in einem bestimmten Zeitbereich für einen Tisch liegen, allerdings auch hier wieder der Punkt -> Hast du Indizes auf den Datumsspalten?

04.11.2018 - 11:48 Uhr

Hi,

hast du denn einmal geprüft, woran es wirklich liegt?
Benötigt die Selektion in MySQL so lange oder liegt es am Transportweg?

Wenn es am Transportweg liegt (was ich mir fast nicht vorstellen kann, ausser du hast eine echt langsame Internetanbindung) dann könnte die SQLite helfen.
Liegt es an der Abfrage wird es vermutlich nur langsamer werden durch die SQLite (vorausgesetzt, der DB Server liegt nicht unter zuviel Last).
Was dir da helfen könnte wäre ein passenderes DB Layout (evtl. fehlen ja auch nur Indizes??) in der MySQL.

Bitte beachte, dass aus Sicherheitsgründen ein lokaler Client nicht direkt mit der DB kommunizieren sollte, sondern soetwas wie eine HTTP Api dazwischen liegen sollte.
Ausserdem solltest du unter keinen Umständen SQL Abfragen per String-Verkettung erstellen, sondern mit Parametern arbeiten: [Artikelserie] SQL: Parameter von Befehlen
Auch würde ich an deiner Stelle mit Klammerungen arbeiten, damit du genau bestimmen kannst, welche deiner WHERE Bedingungen wie verknüpft werden. Um deinen Query zu verstehen müsste ich jetzt nachschlagen, was höher priorisiert ist (AND oder OR), mit Klammern wird es lesbarer.

26.10.2018 - 18:05 Uhr

Hi,

wenn du nur die Reihenfolge der Properties beeinflussen musst, warum erstellst du dir da nicht einen eigenen Converter für JSON.NET ?

https://www.newtonsoft.com/json/help/html/CustomJsonConverter.htm
Das wäre jetzt meine erste Idee.

Wenn du unbedingt mit Reflection arbeiten willst, dann kannst du die Properties doch einfach sortieren, bevor du den Json String zusammenbaust (Abgesehen davon, dass strings mit += zusammensetzen gerade in schleifen problematisch ist).

18.10.2018 - 17:04 Uhr

Hast du in deiner Projektmappe denn ein Projekt, dass ThePLCProject.Model.SQLite heißt?

Das Powershell CmdLet sucht nach dem Projekt, dass du angibst um hier den Datenbank Context erstellen zu lassen.
Ein paar Informationen gibt es dazu in der doku:
https://docs.microsoft.com/de-de/ef/core/managing-schemas/migrations/projects

14.10.2018 - 19:39 Uhr

DateTime.TimeOfDay ist tatsächlich die bessere Lösung. Kannte ich gar nicht - habe ich noch nie gebraucht etwas derartiges 😃

14.10.2018 - 16:48 Uhr

Das DateTime Struct ist nach der Initialisierung mit einem Wert nicht mehr beschreibbar.
D.h., wenn du die Zeit oder das Datum verändern willst, muss du ein neues DateTime Objekt erstellen.

Das kannst du über zwei Wege:
-> Über die Add*() Methoden (z.B. AddHours())
-> Durch addieren eines TimeSpan Objektes

Dabei musst du beachten, dass ein DateTime Objekt immer beides enthält: Datum und Zeit, willst du eine Uhrzeit auf ein bereits bestehendes DateTime Objekt festlegen, kannst du die Property Date des Nutzen.

z.B. so:


DateTime termin = DateTime.Now; 
DateTime zeit = DateTime.Now.AddHours(1.0);

DateTime terminUndZeit = termin.Date.AddHours(zeit.Hour).AddMinutes(zeit.Minutes).AddSeconds(zeit.Seconds);

07.10.2018 - 21:01 Uhr

Ist dein Problem, dass beim auslösen des SerialPort.DataReceived Events noch nicht alle Daten, die du benötigst im Buffer liegen?

Wenn dem so ist, dann musst du dir einfach das zwischenergebnis merken und die Auswertung erst dann starten, wenn alles da ist. --> Das wäre durch eine eigene Klasse zum Handling mit dem SerialPort einfacher gelöst.

Merke: Ein DataReceived Event könnte auch zwei unterschiedliche Informationen vom µC enthalten.

Da du aber nicht genau sagst, was der Fehler oder das Fehlverhalten ist können wir nur ein wenig reinstochern...

Interessant wäre:
-> Was kommt an?
-> Was sollte ankommen?

07.10.2018 - 19:44 Uhr

Mit einem Event liest du nicht zyklisch sondern event getriggert.
Sobald du die SerialPort Instanz mit einem seriellen Port verbindest lauscht dieser auf eingehenden Datenverkehr.

Zyklisch wäre, wenn du immer versuchst einen char zu lesen, allerdings ist dann der zyklus nicht zeitbasiert sondern ebenfalls eventbasiert.
Im Endeffekt ist das SerialPort.Read() also nur ein ausprogrammieren des Eventgetriebenen Ansatzes.

Ist es das was du meinst?

07.10.2018 - 17:46 Uhr

Eine serielle Schnittstelle ist kein Bus sondern eine P2P Verbindung. Einzig allein, wenn du darauf liest erzeugst du keine Last auf dem angeschlossenen zweiten Teilnehmer.

Die SerialPort Klasse von .NET ist dabei ein Wrapper um das Serielle Interface und bietet dir zwei Möglichkeiten Daten zu lesen:
-> Ein Event wird ausgelöst, wenn ein neuer Char anliegt
-> Eine Blockierende Methode, die bis zu einem bestimmten Punkt lesen kann (z.B. 1 Char, EOF, EOL)

Was du davon verwendest liegt an dir, aber wenn du nur einmal kurz liest, nachdem du ein Steuerzeichen/-kommando auf die Verbindung gelegt hast, beachtest du nicht die Verarbeitungszeit auf deinem µC und auch nicht die Übertragungszeigt.

P.S.: Der Artikel mit der drei Schichten Architektur bezog sich darauf, dass du den Klick als auslöser genommen hast um auf der Schnittstelle zu schreiben. Die Datenkommunikationssicht deiner Anwendung sollte nichts von einem Klick wissen, sondern lediglich, dass sie jetzt Daten abrufen soll.

07.10.2018 - 12:42 Uhr

Hi,

das klingt als würdest du nur einmalig, direkt nach dem Button Klick die Daten lesen?

Generell würde ich das lesen der Daten in den Hintergrund auslagern. Dafür müsstest du allerdings erkennen, wann der µC fertig geschrieben hat - ausser du kannst davon ausgehen, dass wann immer etwas gesendet wird, du es in die Textbox schreiben kannst.

Ich würde dir empfehlen dir die Drei-Schichten-Architektur anzuschauen, dann wärst du vermutlich gar nicht in diese Lage gekommen:
[Artikel] Drei-Schichten-Architektur

05.10.2018 - 15:39 Uhr

Kannst du einen Updater Prozess nicht als Hintergrundservice installieren?
Dann könnte der schreibende Rechte auf den Ordner bekommen und dort die Programme updaten ohne dass ein Benutzereingriff notwendig ist.

Soll eine manuelle Aktualisierung notwendig sein, so müsstest du eine Interaktionsschnittstelle schreiben. Aber das ist kein hexenwerk.

So funktioniert das "Ich will was installieren" Programm bei uns auf Arbeit auch und sorgt dafür, dass Programme richtig installiert werden können ohne das Adminrechte der Nutzer notwendig sind.

03.10.2018 - 14:54 Uhr

Nichts für ungut, aber das was ihr mit partial macht ist nur ein verschlimmbessern des Codes.

Partial sorgt ja im Endeffekt nur dafür, dass der Compiler "den Code vor dem Kompilieren zusammenkopiert".
Im Sinne von OOP wäre hier ein Entwurfsmuster anzuwenden, dass dieses Problem löst und eine saubere Trennung erzeugt. Für WPF wäre das MVVM, mit Xamarin habe ich selber noch nichts gemacht, aber XAML weist an sich schon auf MVVM hin. Entsprechend sollte es ein ViewModel geben, welches den Fortschritt als Property bereitstellt und ein Command im ViewModel zum starten der Hintergrundaktion.

Code Behind Spielereien werden sehr schnell zu komplex (und nichts anderes macht partial ja) um sie zu handhaben.

03.10.2018 - 13:13 Uhr

Für das Font-Awesome-WPF benötigst du gar keine unicode Zeichencodes, dort werden die Icons über deren Namen adressiert:

<fa:ImageAwesome Icon="Flag" />

Was genau versuchst du also?

02.10.2018 - 22:36 Uhr

Gemeint ist vermutlich die Fluent API von Entity Framework zur Konfiguration der Entitäten.

Für EFCore z.B. hier: http://www.entityframeworktutorial.net/efcore/fluent-api-in-entity-framework-core.aspx

30.09.2018 - 18:26 Uhr

Ich fürchte, dass das mit einem Button und einem einfachen Binding nicht gehen wird.

Entweder du würdest für jede Zelle einen eigenen Togglebutton anlegen, der den Zustand speichern kann und auf den dein Binding geht oder du erstellst ein eigenes Control, dass verwendet wird um die Zelle darzustellen, welches über eine IsItalic und IsBold DependecyProperty verfügt.

26.09.2018 - 19:59 Uhr

Dein Regex kann beliebig komplex werden - vor allem dann, wenn zusätzliche Felder dazu kommen.

Du müsstest es ja nicht zu objekten Deserialisieren, aber du könntest es als Json einlesen und navigieren: https://www.newtonsoft.com/json/help/html/ReadingWritingJSON.htm
Es gibt auch Möglichkeiten ähnlich zu XPATH (da fällt mir allerdings der Name nicht ein - Google wird da helfen).

05.09.2018 - 18:05 Uhr

Ich lehne mich mal weit aus dem Fenster... aber sagt der CLOUD Act nicht aus, dass Regelungen hierfür mit den entsprechenden Ländern getroffen werden müssen? Mir ist das so in Erinnerung, weil der herausgebende Anbieter ansonsten gegen geltendes Recht in den Ländern verstoßen würde, in denen die RZ's betrieben werden.

05.09.2018 - 15:25 Uhr

Der Heise Artikel ist leicht unter aller Kanone. Als extrakt kann man sagen, dass Microsoft eine virtuelle IP im routbaren Bereich, die in jedem RZ genutzt wird und zu der Daten fließen.
--> Was der Artikel nicht direkt sagt ist, dass man nicht nachvollziehen kann ob diese IP in den USA liegt oder doch nur zwei Schränke neben meiner VM. Da muss man den Verträgen und Zertifikaten vertrauen. Das muss man aber sowieso.

Dass Daten fließen ist logisch, denn jeder Virtualisierer nutzt Agents auf den Maschinen um diese über die virtuelle Hardware hinaus zu überwachen und Kommandos (wie z.B. Fahre herunter) zu senden.
Dass diese IP in jedem RZ gleich ist spart Konfigurationsaufwand und Pflegeaufwand für die Images (wobei man das sicher automatisieren könnte oder z.B. über eine DNS Auflösung lösen könnte).

DSGVO betrifft (nach meinem Kenntnisstand) Hauptsächlich Personenbezogene Daten. Hierzu werden die Daten, die in einem Serversystem anfallen, welches gerade Provisioniert wurde sicherlich nicht gehören (ausser eventuell dem gewählten Administrator Benutzernamen).

05.09.2018 - 15:13 Uhr

Alternativ dazu gibt es auch (noch) die VS 2017 Express für Windows Desktop, welche auch kommerziell komplett kostenfrei genutzt werden darf.

Von VS 2017 gibt es keine Express Versionen mehr. Lediglich Community, Professional und Enterprise.

Edit: Ich revidiere.. die gibts ja tatsächlich noch.

02.09.2018 - 12:35 Uhr

Ich würde eine Prüfsumme mit auf den Beleg bringen, die nur du in dieser Form erstellen kannst. Damit kannst du prüfen ob tatsächlich du (bzw. das Unternehmen) diesen Beleg erstellt hat. Dabei muss der Betrag ebenfalls mit in die Prüfsumme hinein.

Das würde dann einer Signatur entsprechen. Was ich auf keinen Fall machen würde, wäre einen Fancy-Prüfsummen Algorithmus selber entwickeln, sondern eine Zertifikatsbasierte Signatur nutzen.

30.08.2018 - 16:06 Uhr

In Azure wäre es eine WebApp, die du nimmst. Da ist der kleinste Teil (nach der Free Variante) auch noch recht teuer (glaube um die 50€).

24.08.2018 - 20:44 Uhr

Wenn ich das richtig verstehe, weißt du beim Abruf der Daten von der API nicht, was zurückkommt?
In dem Fall könntest du mithilfe von eigenen Convertern und Newtonsoft.Json arbeiten, das Format erkennen und das richtig Objekt erstellen.

Wenn du weißt, wie die Struktur aussieht erstelle dir selber oder mithilfe eines von vielen online verfügbaren Generatoren aus dem Json eine (bzw. mehrere) Klasse(n) und lass den string zu Objekten von diesen deserialisieren.

Edit... oh kein neuer thread...

Edit2: Wenn du ein Array mit zwei unterschiedlichen Objekten zurück bekommst, kommst du vermutlich nicht um eigene Converter herum: https://www.newtonsoft.com/json/help/html/CustomJsonConverter.htm

22.08.2018 - 22:00 Uhr

Steht dir auch das Azure AD zur Verfügung?
Falls ja würde ich über OIDC gehen und vielleicht sogar die Accountverwaltung durch IdentityServer4 machen lassen, da bekommst du das schon fertig und musst dich in deiner Anwendung nicht mehr darum kümmern.

21.08.2018 - 22:00 Uhr

Vom Prinzip ja.
Du kannst die API Beschreibung (ähnlich wie das wsdl) auch vom Server dynamisch generieren lassen und dann deinen Client Code daraus generieren. Ist - finde ich - einfacher, als die DTO's in einer Shared Lib zu halten.

21.08.2018 - 20:10 Uhr

Wenn dein Client ausschließlich auf Windows läuft - was spräche dagegen den initialen "Dominostein" von Windows sichern zu lassen?
Windows bietet dazu eine API, in der auch z.B. IE die Zugangsdaten für Webseiten speichert (ob es bei Edge noch genau so ist weiß ich allerdings nicht) und diese wären mit den Benutzerkonto* abgesichert.

* Allerdings dem lokalen Benutzerkonto, nicht mit dem Active Directory Konto. Bei einem Rechnerwechsel müsste also irgendwie einmalig dieser Schlüssel wieder eingegeben werden.

21.08.2018 - 20:06 Uhr

Es gibt auch für RESTful API's eine gemeinsame Beschreibungssprache, das OpenAPI Format.
Für .NET und ASP.NET (inkl. Core) gibt es sogar mehrere Toolings, z.B. NSwag.

15.08.2018 - 19:47 Uhr

Prinzipiell eignet sich dafür jedes Dateiformat. Die Frage ist ob es sinnvoll ist soetwas zu machen - die würde ich dir selber überlassen.

Im Endeffekt bildet die Konfigurationsdatei, egal ob xml, json oder ini nur eine Objektstruktur (also Instanzen von Klassen) ab, die du zur Laufzeit mit Werten aus der Datei (= Deserialisierung) befüllst und dann auswertest.
Das gleiche würde auch mit einer Datenbank oder einer anderen Abstraktion (z.B. HTTP REST API) funktionieren.

Ini Dateien bieten dir dabei allerdings lange nicht die Flexibilität und Unterstützung durch Bibliotheken, wie xml oder json. Sie haben gefühlt auch eher den Touch der 90er Jahre 😃

06.08.2018 - 14:56 Uhr

Abgesehen von den Empfehlungen der anderen hier ist das Problem, dem di gegenüberstehst genau der gleiche grund, warum du eine Abstraktionsschicht zwischen App und DB verwenden solltest:

PHPMyAdmin ist eine solche Abstraktion. Als Webseite läuft das backend - dass mit der Datenbank kommuniziert - auf deiner NAS. Deswegen benötigt es auch Zugriff von 127.0.0.1, nicht von extern.
Dein benutzer scheint so angelegt zu sein, dass er nur von localhost zugreifen darf.

04.08.2018 - 21:18 Uhr

Docker kann für dich eine Serverseite einer WebApp sein.
Weder unter .net core, noch unter Mono kannst du WPF nutzen. WinForms nur unter Mono und nur eingeschränkt... allerdings als Client für z.B. eine REST API, die du in Docker haben kannst.

Wenn du etwas Webbasiertes verwenden willst wäre Docker die richtige Wahl. Willst du WinForms nutzen, so kannst du durchaus deine Logik in Docker abbilden musst aber die GUI davon getrennt haben.

29.07.2018 - 20:52 Uhr

Wenn ich die Doku der API richtig deute sollten die Parameter über die URL mit übergeben werden und nicht im Body.

Hast du dir einmal die bereits fertigen Bibliotheken angeschaut, die es für MediaWiki gibt?
https://www.mediawiki.org/wiki/API:Client_code

21.07.2018 - 18:06 Uhr

Vielen Dank, so wird dann auch ein Schuh draus.

18.07.2018 - 17:34 Uhr

Hi Abt,

danke für deine Geduld mit mir. Ich komme wahrscheinlich einfach aus einer sehr unterschiedlichen Welt der Programmierung und muss mich erst noch an vieles Gewöhnen.
Die Doku zum persistieren der Verbindungen hatte ich mir schon angeschaut - es bleibt mir allerdings noch eine Frage, vielleicht verstehst du dann auch meine ganzen Fragen in der Richtung besser 😃

-> Ein Websocket ist ja anders als eine Klassische Webseite (ob SPA mit WebApi, MVC oder irgendwie anders gelagert) eine Stateful Application, durch den logischen Kanal der hier mittels einer aufrechterhaltenen TCP Verbindung herrscht bekommt die App einen Zustand (den Socket in diesem Fall).
Wenn ich jetzt die "Verbindung" persistiere kann deswegen doch eine zweite Instanz nicht auf diesen Zustand zugreifen, denn die Verbindung hat als Inhalt nur Benutzerdefinierte Proerties, aber niemals einen Socket.. diesen kann ich gar nicht auf diese Weise persistieren.

Folgendes Szenario:
Es existierten zwei Instanzen der Websocket App (A, B).
Client baut Verbindung mit Instanz A der Websocket App auf.
Instanz B (hängt an der gleichen Queue des Service Bus) erhält eine Nachricht, die für den mit Instanz A verbundenen Client bestimmt ist, holt sich die "Verbindung" aus dem Storage und dann? Wie kommt die Nachricht in den logischen TCP Kanal? Einfach senden kann die Instanz B ja nicht, das blockiert jede Firewall.
Oder ist das alles soweit standardisiert, dass sich jeder beliebige Reverse Proxy (denn was anderes sind ja Load Balancer nicht) um die Weiterleitung kümmert?

PS: was die Authentifizierung mit dem EventProcessor des Event Hub zutun hat, weiß ich leider nicht 😉

Das bezog sich auf

Damit könntest Du den ASP.NET-Part weglassen, wenn Du Cloudnative sein willst.

aber vielleicht fehlen mir dazu die basics, denn der ASP.NET-Part kümmert sich bei mir neben Authentifizierung (über JWT) noch um die Authorisierung.

17.07.2018 - 13:57 Uhr

Hi,

ich bin kein Experte, was WinForms angeht und auch kein Freund von direktem Datenbankzugriff von Applikationen.. aber das kleingt, als würdest du Databinding betreiben. In dem Fall müsstest du dafür sorgen, dass die Datenquelle deiner Checkbox True wird, anstatt in der GUI das Checked zu setzen.