Neujahr 👍 👎

Ich bedanke mich für das bisherige Interesse und wünsche ein glückliches und erfolgreiches neues Jahr 2016.

Ich würde mich natürlich sehr darüber freuen, dich auch im nächsten Jahr wieder hier begrüßen zu dürfen.

.NET-Guidelines für Programmbibliotheken 👍 👎

Da es in Projekten im Allgemeinen des Öfteren zur Frage kommt, wie Member benannt und strukturiert werden sollen und ich erst vor Kurzem im Büro darauf hingewiesen habe, möchte ich auch an dieser Stelle einmal auf die Framework Design Guidelines von Microsoft hinweisen, welche einen Leitfaden zur Implementierung darstellen.

Wichtig zu verstehen ist dabei, dass sich diese Richtlinien nur auf die öffentliche Schnittstelle (also insbesondere Member mit public- oder protected-Modifizierer) beziehen und grundsätzlich keine Aussagen zu internen (private-Modifizierer) Membern treffen. Es bietet sich jedoch durchaus an, auch hier konform zu gehen. Die Einleitung weist auch explizit darauf hin, dass ein – gut begründetes – Abweichen von diesem Regelwerk legitim ist.

Im MSDN findet sich im Übrigen auch eine Übersicht der Warnungen bei der Analyse von verwaltetem Code.

UNIX-Zeitstempel und C# 👍 👎

In einem älteren Beitrag zum Thema Erweiterungsmethoden in C# hatte ich eine kleine Methode zur Arbeit mit UNIX-Zeitstempeln als Beispiel verwendet. Dieser Beitrag wird auch heute noch relativ häufig aufgerufen, weswegen ich zu diesem konkreten Beispiel anmerken möchte, dass das .NET-Framework seit Version 4.6 Funktionalität zur Arbeit mit entsprechenden Zeitstempeln auf der DateTimeOffset-Struktur bereithält:
Die Verwendung gestaltet sich wie üblich sehr einfach:
Konvertierung von UNIX-Zeitstempeln
010203040506070809
  // UNIX-Zeitstempel für aktuelles Datum und aktuelle Uhrzeit ermittelnlong unixTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
// bestimmtes Datum um 0:00 Uhr verwendenunixTimestamp = (new DateTimeOffset(new DateTime(1988, 1, 29))).ToUnixTimeSeconds();

// DateTime-Objekt lokaler Zeit aus UNIX-Zeitstempel erzeugenDateTime dateTime = DateTimeOffset.FromUnixTimeSeconds(unixTimestamp).LocalDateTime;
Eigene Implementierungen sollten für die aktuelle Praxis daher nicht mehr nötig sein.

Aufzählungswert per Zeichenkette ermitteln 👍 👎

Vor sehr langer Zeit habe ich bereits einen Artikel zu Enumerationen in C# geschrieben, an welchen ich indirekt anknüpfen möchte. Oftmals steht man im Bereich der Softwareentwicklung vor dem Problem der Interoperabilität, da mehrere – bisweilen äußerst unterschiedliche – Systeme zusammenarbeiten müssen.

Ein klassischer Fall im Bereich der Webentwicklung ist die Zusammenarbeit aus Anwendung und Datenbank, beispielsweise hier im Blog zwischen der Programmiersprache C# mit ASP.NET MVC-Framework und MySQL-Datenbank. Etwas konkreter soll es darum gehen, C#-Aufzählungstypen zusammen mit MySQL-ENUMs zu verwenden, welche grundsätzlich erst einmal als bloße Zeichenketten zu behandeln sind. Für das folgende Beispiel nehmen wir an, dass eine Tabelle user existiert, die eine Spalte state vom Typ ENUM('ACTIVE','INACTIVE','LOCKED') enthält.

Unter Verwendung des ADO.NET Entity Framework würde beim Database First-Ansatz eine entsprechende Klasse user mit der Eigenschaft state vom Typ string erzeugt. Da es sich um eine partielle Klasse handelt, erweitern wir diese um eine neue Eigenschaft State. Diese soll anschließend die automatische Konvertierung für state übernehmen und ermöglicht uns im Programmcode einen typsicheren Zugriff auf den Status des Benutzers:
Aufzählungstyp UserState anlegen
0102030405
public enum UserState {    Active,    Inactive,    Locked}
Erweiterung der Klasse user
010203040506070809
public partial class user {    public UserState State {        get {            return (UserState) Enum.Parse(typeof(UserState), this.state, true);        }        set {            this.state = value.ToString().ToUpper();        }    }
Die Verwendung gestaltet sich nun – mit beiden Eigenschaften – wie gewohnt komfortabel:
Verwendung
0102030405060708091011121314151617
user dbUser = new user() {    State = UserState.Active};  // üblicherweise aus Datenbank ermittelt

string state = dbUser.state; // "ACTIVE"UserState userState = dbUser.State; // Active
dbUser.State = UserState.Inactive;

state = dbUser.state; // "INACTIVE"userState = dbUser.State; // Inactive
dbUser.state = "LOCKED";

state = dbUser.state; // "LOCKED"userState = dbUser.State; // Locked
Weitere Informationen zu den Enum.Parse-Methoden finden sich wie üblich im MSDN. Es lohnt sich außerdem ein Blick auf die Enum.TryParse(…)-Methoden mit generischem Typ-Parameter.

DNS-Blacklisten mit C# abfragen 👍 👎

Im früheren Beitrag zur DNS-Auflösung mit C# haben wir eine grundlegende Möglichkeit kennengelernt, IP-Adressen zu Domains zu ermitteln. Dies möchten wir uns zu Nutze machen, um DNS-Blacklisten abzufragen, welche von vielen eMail-Systemen genutzt werden, um potentiellen Spam zu erkennen (und ggf. abzuweisen).

Zu den bekannten Anbietern entsprechender Dienste gehören beispielsweise: Diese setze ich auch selbst ein und habe jeweils gute Erfahrungen damit gemacht. Bitte informiert euch jedoch vor einem Einsatz beim jeweiligen Anbieter über die genauen Konditionen, der kommerzielle Einsatz ist beispielsweise oftmals kostenpflichtig. Ebenso verhält es sich je nach Anbieter ab einem gewissen Abfragevolumen.

Um nun eine IP-Adresse gegen die entsprechenden Dienste prüfen zu können, müssen wir diese dem oben angegebenen Hostnamen in umgekehrter Reihenfolge voranstellen und eine Namensauflösung durchführen.

Konkret fragen wir also beispielsweise bei einer Prüfung der IP-Adresse 80.78.81.19 auf Spam-Aktivität laut Spamhaus das Ergebnis der Domain 19.81.78.80.zen.spamhaus.org ab (welches hoffentlich negativ beschieden werden sollte). Per C# könnte man dies nun beispielsweise (durchaus verbesserungsfähig) wie folgt durchführen:
IP-Adresse auf Blacklisting prüfen
010203040506070809101112131415161718192021222324
public static bool CheckBlacklisting(IPAddress ipAddress, string blacklist = "zen.spamhaus.org") {    string ipAddressReversed = String.Join(".", ipAddress.GetAddressBytes().Reverse());    string hostName = String.Concat(ipAddressReversed, ".", blacklist);
try { foreach(IPAddress hostAddress in Dns.GetHostAddresses(hostName)) { /** * Achtung: Diese Implementierung ist naiv und sollte nicht direkt * übernommen werden. Je nach Anbieter, so beispielsweise auch bei * Spamhaus, gilt nicht der gesamte Loopback-Adressbereich als Spam. * Daher bitte vorher beim Anbieter informieren und konkretisieren! **/ if(IPAddress.IsLoopback(hostAddress)) { return true; } }
return false; } catch { return false; }}
bool checkResult = CheckBlacklisting(IPAddress.Parse("80.78.81.19")); // false
Das Ergebnis der Namensauflösung, also die erhaltene IP-Adresse, gibt darüber hinaus Aufschluss über den genaueren Status. Spamhaus liefert dazu beispielsweise in ihren FAQ weiterführende Informationen.

Projektverweise

Kategorien / Archiv  |  Übersicht RSS-Feed

Schlagworte

Suche