Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Papst
Thema: Console-Fenster soll bei Fehlermeldung stehen bleiben.
Am im Forum: Grundlagen von C#

Du könntest die Fehlermeldung Loggen, z.B. in eine Datei. Am besten mithilfe eines ordentlichen Logging und Exception Handling Konzeptes.

Wie startest du denn die Anwendung? Per Doppelklick?
Wenn du sie aus einer Console startest, siehst du auch alle ausgaben.

Thema: DateOnly und TimeOnly - die neuen Typen in .NET 6
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Die Konvertierung von DateTime nach DateTimeOffset funktioniert über einen impliziten Cast.

Aus dem Quellcode von DateTimeOffset:


public static implicit operator DateTimeOffset(DateTime dateTime)

Die Konvertierung sorgt dafür, dass wenn du eine DateTime Objekt übergibts, dass als Kind "Local" ist, die Zeitzone des aktuellen, den Code ausführenden Systems an das neue DateTimeOffset objekt übergeben wird. Ist dein DateTime Objekt UTC, wird ein DateTimeOffset objekt mit Offset = 0 erzeugt.

Es kann dabei zu Problemen kommen, wenn du ein Datum auf einem System verarbeitest, dass in einer anderen Zeitzone steht und du dies nicht erwartest.
Ich würde nach Möglichkeit darauf verzichten DateTime und DateTimeOffset zu mischen.

Thema: Enterprise Projekt auf Mac (Kompatibilität)
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hi,

ich habe selber keinen MAC, es gibt allerdings Technologien, die von .NET unterstützt werden aber nicht auf dem MAC lauffähig sind.
Das sind z.B. Windows Forms und WPF.

Die ARM Plattform von Apple wird auch "erst" mit .NET 6 unterstützt.

Thema: Xamarin - Shelly 1 Plus - Digest Authentifizierung
Am im Forum: Cross Platform Entwicklung - Mobile und IoT

Dein HttpClient macht nichts, du verwendest in deinem Code weiterhin den HttpWebRequest.

Thema: Projektvorstellung: LocalizeMe (Typsichere Lokalisierung)
Am im Forum: Projekte

Ich hab mir das Projekt nicht angeschaut, bin aber über das hier im Thread gestolpert:

Zitat von IntelliSoft


namespace dotnetProTest
{
 internal enum Colors
 {
 RedColor
 }
}
Wichtig, daß der Lokalisierungs Name Genau den selben Namen hat, wie die Enum selbst.

Wenn hier wieder Namen übereinstimmen müssen - wo ist dann die Typsicherheit?
Da müsste dann eher ein Quellcode Generator dazwischen, damit das wieder typsicher ist, sonst könnte mir passieren, dass ich den Enum Eintrag RedColour nenne und nichts geht mehr?

Thema: Performante User Logs auf Azure
Am im Forum: Datentechnologien

Wenn du nur nach Datum (und vermutlich Zeit) filterst, könntest du auf den Table Storage gehen. Der ist günstiger als Cosmos DB und bei richtig gewähltem PartitionKey und RowKey geht das einfache filtern auch sehr gut.

Thema: AuthenticationHandler zur Laufzeit hinzufügen (ASP.Net Core, AzureAD)
Am im Forum: Web-Technologien

Authentication Provider zur Laufzeit zu ändern ist durchaus Möglich (wertfrei), es gibt da eine passende Implementierung:
https://github.com/Aguafrommars/DynamicAuthProviders

Meines Wissens ist diese entstanden um IdentityServer 4 zur Laufzeit weitere Federations zu ermöglichen.

Thema: Linq sortierung und summierung
Am im Forum: Grundlagen von C#

Die Controller Action macht eigentlich etwas anderes oder? Ich bin etwas verwirrt

Was genau klappt denn nicht?


 Document document = await _context.Documents.FindAsync(eId);
// document != null ?
           document.Total = _context.PaymentInformations
                                .Where(b => b.Document.Id == eId)
                                .Sum(a => a.PaymentSum);

await _context.SaveChangesAsync();

Sollte prinzipiell das machen, was du möchtest. Die PaymentSum aller PaymentInformations dieses einen Dokuments auslesen und aufsummieren.

Da du aber die neue, übergebene Entität erst danach in die Datenbank speicherst wird diese fehlen.

Ich empfehle einen Blick in den Artikel über [Artikel] Drei-Schichten-Architektur

Thema: Kontinuierliche Mysql Abfrage
Am im Forum: Datentechnologien

Direkt mit der Datenbank wirst du nicht um pollen (abfragen) herumkommen.

Bei solchen Anforderungen setzt man (idr. setzt man immer einen) (Web-)Service zwischen deine Programme und die Datenbank um dann mit Push-Technologien wie z.B. SignalR die Clients zu informieren.

Thema: Wie kann ich AudioGenie3.dll einbinden
Am im Forum: Rund um die Programmierung

Alles in Code Tags zu schreiben ist nicht so angenehm zu lesen

Siehst du den Unterschied zwischen Doku und deiner Implementierung? Du willst einen UInt-Pointer übergeben, erwartet wird ein LPCWSTR. Ein Int16 ist ein short in C#.

Thema: Kalender Ende 2100
Am im Forum: Rund um die Programmierung

Das kommt natürlich auf die interne Datenrepräsentation an.. und kann auch eine Design Entscheidung sein.

Das was du siehst ist ja nur das Frontend der Software und was dort angezeigt wird oder auswählbar ist hat nichts mit dem zu tun, wie etwas hinterher abgespeichert wird.

Thema: c# JSON Api für Personio
Am im Forum: Web-Technologien

Erstelle dir eine Klasse (dafür gibt es Generatoren, die aus dem JSON C# Code erstellen) und lass es dir in diese deserialisieren.

Das würde dir übrigens auch eine Bibliothek wie Refit abnehmen.

Übrigens: der HttpWebRequest, den du verwendest ist veraltet (auch das würde dir refit abnehmen).

Thema: Source Code Generatoren: Basisnamespace einer Class Library ermitteln
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Das klingt ganz gut.. ist aber etwas komplexer in der Umsetzung als der ISourceGenerator.

Vielen Dank - schaue ich mir mal an

Thema: Source Code Generatoren: Basisnamespace einer Class Library ermitteln
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Das kannte ich schon, aber das hilft tatsächlich.

Ich hole mir einfach alle namespaces aller Klassen und nehme den kürzesten.
Alternativ: mit einem eigenen Namespace arbeiten.

Besten Dank!

Thema: TicTacToe Gewinnüberprüfung
Am im Forum: Rund um die Programmierung

Die Gewinnbedingung ist ja, dass drei gleiche Felder in einer Reihe sind. Wenn du also die einzelnen Felder durchgehst würde es reichen alle angrenzenden zu schauen und schauen ob diese übereinstimmen und der gegenüberliegende auch.
Du brauchst (ohne Optimierungen) also nur die inneren Felder durchlaufen und jeweils die angrenzenden Felder prüfen.

Thema: DataGridview Dynamische Farbe
Am im Forum: GUI: Windows-Forms

Wenn du mit Scopes (geschweiften Klammern) arbeitest kannst du dir die zweite Schleife sparen.

Thema: DataGridview Dynamische Farbe
Am im Forum: GUI: Windows-Forms

Schau dir das mal mit dem Debugger an.
Du greifst dort auf die Cells Eigenschaft einer Zeile zu, die alle Zellen der Zeile enthält.
Durch das ToString() erhälst du keinen Fehler, der Rückgabewert von ToString() ist aber vermutlich immer derselbe.

[Artikel] Debugger: Wie verwende ich den von Visual Studio?

Thema: Source Code Generatoren: Basisnamespace einer Class Library ermitteln
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Oh cool.. das ist eine gute Quelle für Lösungen, die ich bei mir noch unschön finde.

Problem an der Namespace Lösung bei Refit ist, dass ich ein INamedTypeSymbol bräuchte... ich könnte halt irgendeins nehmen oder das, was den kürzesten Namespace Namen hat.
Schade, dass der Default Namespace kein Teil der Kompilierung ist, nur Teil des Projektes

Thema: Source Code Generatoren: Basisnamespace einer Class Library ermitteln
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hi,

ich erstelle gerade einen ISourceGenerator und möchte diesen nicht nur in Projekten mit Main Methode, sondern auch in Klassenbibliotheken einsetzen.
Der Generator erstellt eine Erweiterungsmethode in einer eigenen Klasse für den DI Registrar. Als Namespace möchte ich gerne den Basisnamespace der Lib einsetzen, damit die Erweiterungsmethode direkt verfügbar ist.

In ausführbaren Projekten erhält man den Namespace der Main Methode relativ simpel über


baseNamespace = context.Compilation.GetEntryPoint(context.CancellationToken)?.ContainingNamespace.ToDisplayString();

In einer Klassenbibliothek ist die Rückgabe von GetEntryPoint() allerdings null. Dort behelfe ich mir mit


baseNamespace = context.Compilation.Assembly.MetadataName;
Das ist nicht optimal, denn dieser kann anders sein - sagt schon der Kommentar. Die Property Name ist mit ähnlichen Einschränkungen belegt.
Ich hatte überlegt einfach die Namespaces durchzugehen und aneinanderzusetzen und zu schauen ab wann ich das erste mal eine Typdefinition finde - das finde ich allerdings unsauber (Namespace Parts in der Assembly erhält man via context.Compilation.Assembly.NamespaceNames).

Irgendwie fehlt mir die saubere Lösung.

Thema: Exchange 2022 Bug
Am im Forum: Smalltalk

Ohne jetzt den Bug beschönigen zu wollen.
Zeitstempel sind mit eine der komplexeren Sachen, die man programmieren kann, gerade wenn man Hardwarenah oder mit einer älteren, evtl. portierten Codebasis unterwegs ist.
Aber einen Zeitstempel Dezimal in ein binäres System zu pressen ist schon „interessant“.

Thema: Query Parameter bindet nicht
Am im Forum: Web-Technologien

Moin,

Ich erliege gerade einem seltsamen Problem, für dass ich die Lösung nicht alleine finde.
Ich habe zwei Controller, die ähnlich aussehen:

  • gleiche Attribute auf Controller Ebene (ApiController, Route)
  • fast gleiche Attribute auf der Action (HttpGet, 3x ProducesResponseType)
  • ähnliche Methodensignatur

Ich binde hier ein record an die Query Parameter mittels des FromQuery Attributs. Die records der beiden Controller haben dieselben Properties.
Bei dem einen Controller funktioniert das blendend, es werden alle Properties gebunden, sobald diese als Query String vorhanden sind, bei dem anderen Controller wird allerdings die eine Property nicht gebunden und ist immer null, während ich sie im Query Property des Requests aber sehen kann.

Was ich bereits ausgeschlossen habe:
  • Es hängt nicht an der record selber, andere Properties funktionieren - es liegt nur an der einen „string?“ property
  • Es liegt nicht an „init“ anstatt „set“
  • Es liegt nicht an record, als class habe ich diegleichen Probleme
  • Groß/Kleinschreibung ist es auch nicht
(Nicht, dass ich einen der Punkte erwartet hätte, aber ich wollte es ausschließen)

Was könnte es noch sein und wie kann ich das sinnvoll debuggen? Mein Versuch mit Modelbindern dahinter zu kommen scheitert dann daran, dass der Modelbinder alleine schon das komplette Konstrukt in ASP.NET Core 6 aushebelt und der Binder selber verantwortlich ist.

Thema: Mein erstes (funktionierendes) Programm
Am im Forum: Code-Reviews

Hi,

wenn du Daten von einem Benutzer einliest, musst du immer sicherstellen dass valide Daten vorliegen - vor allem dann, wenn du den eingegebenen string Datentyp in einen anderen Datentyp umwandelst.
Dieses umwandeln nennt sich parsen.

Stell dir vor, ich als Anwender gebe an dieser Stelle keine Ganze Zahl oder sogar einen Buchstaben ein:


 int output = Convert.ToInt32(Console.ReadLine());
Das würde ein Programm zum Absturz bringen.

Als Eingabe in deine Methode Exchange gibst du verschiedene Zahlenwerte, diese sind innerhalb der Methode selber nicht sprechend - betrachtet man die Methode unabhängig, dann kann der Entwickler dort nicht wissen, was die Bedeutung von input = 1 ist.
Eine Möglichkeit hier wäre ein enum zu verwenden.

Anstelle der if/else Kombination würde sich ein switch oder eine switch expression anbieten.

Das ist etwas zu kompliziert als Lösung für dein Problem, man könnte hier aber mit einem Factory Pattern herangehen und für jede Konvertierung eine eigene Implementierung eines ICurrencyExchange Interfaces implementieren.

Wie du siehst führen immer ganz viele Wege ans Ziel. Welcher dabei der richtige ist, hängt immer an den Anforderungen die du selber oder jemand anders an deine Applikation stellt.

Thema: Umgang mit Secrets in Webhosting-Paketen
Am im Forum: Web-Technologien

Das kommt ganz auf deine Umgebung an.

In Azure gibt es die Möglichkeit das in einen Key Vault (Geheimnisspeicher) auszulagern. Azure übernimmt dann die Bereitstellung der Authentifizierung ggü. dem Key Vault.
On Prem gibt es andere Anbieter, HashiCorp Vault z.B.

Thema: Exceptions in einem BackgroundService
Am im Forum: Rund um die Programmierung

Ich würde dir empfehlen, dir einmal den Prozess aufzumalen und zu visualisieren.

Wenn dein Background Service keine parallele Verarbeitung kann, wird er immer nur ein Item aus der Queue entnehmen und verarbeiten. Ein neues Item wird dann in der Queue verbleiben, bis die Verarbeitung des vorherigen abgeschlossen ist.

Hast du denn schon einmal Beispiel Implementierungen gemacht und ein wenig herumgetestet?

Thema: Exceptions in einem BackgroundService
Am im Forum: Rund um die Programmierung

Was möchtest du denn mit den Exceptions erreichen?

Der BackgroundService ist in sich geschlossen, eine Exception würde dazu führen, dass er abstürzt. In deiner App ist er nur insofern eingebettet, dass er an den Lifecycle der Applikation gebunden ist.

Wer sollte die Exception fangen?

Thema: HttpClient - Authentifzierung
Am im Forum: Web-Technologien

Das sollte Basic Authentication sein - hoffe ich
Kommt, wenn du im Browser versuchst das aufzurufen eine Anmeldeseite vom Browser (als Popup)?

Falls ja, dann ist das, was der Browser macht wenn du User und PW vor der URL mit angibst Basic Authentication. Der Browser erzeugt für deinen Request einen Authentication Header mit Wert $"{user}:{pass}" als Base64 kodierten Wert.

P.S.: Auf Result zugreifen solltest du vermeiden. Wenn du await nicht verwenden kannst, nimm GetAwaiter().GetResult().

Thema: MS Graph Delta Dauer der Verarbeitung
Am im Forum: Web-Technologien

Das kommt drauf an, wie du das gestaltest.

Der Channel an sich ist Thread Safe (auch eine ConucrrentQueue wäre hier möglich, das ist nur ein Beispiel).
Am besten du liest einfach die Doku hinter dem Link, den ich gepostet habe. Der Rest hängt davon ab, ob du parallelisieren kannst.

Thema: MS Graph Delta Dauer der Verarbeitung
Am im Forum: Web-Technologien

Hi,

hier gibt es mehrere Möglichkeiten damit umzugehen.
Dein Ziel wäre es ja, die Datenbank Verarbeitung asynchron im Hintergrund laufen zu lassen.

Du kannst die Verarbeitung mit der Datenbank bspw. einfach in einem IHostedService auslagern mit einem Channel mit diesem kommunizieren.

Thema: Datenupload zur Azure cloud
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Das wird du berechnen müssen, was da am besten für dich ist.

Bei Blobs kostet dich der Traffic nichts (eingehend in Azure), wohl aber die Anzahl an Requests.
Blob Storage bietet dabei z.B. AppendBlobs an, die du in beliebigen Größen immer wieder erweitern kannst (Ich habe das allerdings bisher nur mit Text Formaten gemacht - wüsste aber nicht, was gegen Binärformate sprechen sollte). Du musst allerdings mehrere Requests machen um etwas anzufügen (Properties lesen, Lease erstellen, Upload, ggf. Lease erneuern, Lease entfernen)
BlockBlobs kannst du als Chunk hochladen - hier wäre vermutlich aber der Blob weg, wenn du den PC neustartest.

Prinzipiell kann man da leider nur sagen: Kommt auf deine Anforderungen an.

Thema: Start in eine beispielhafte Adressverwaltung
Am im Forum: Grundlagen von C#

Damit das nicht zu einem "Zugriff auf DB direkt oder indirekt"-Thread wird, nur zwei Dinge zu bedenken:
Es kommt immer sehr genau auf das Szenario an, ob ein direkter Datenbank Zugriff gewollt sein kann. Dabei spielt neben der Sicherheit (Jeder Anwender benötigt Datenbank Zugriff, Jeder Anwender HAT Zugriff auf die Datenbank und kann nicht nur das machen was ihm die Anwendung erlaubt, Datenbank ist über Netzwerk erreichbar, ...) auch Lizenzen eine Rolle, bei CAL's kann es sein, dass bei direktem Zugriff für jeden Anwender eine Lizenz erforderlich ist.