Read the Source of a Website with C#
Manchmal kann es sinnvoll sein, den Quelltext einer Webseite automatisiert abzurufen, beispielsweise um Tests durchzuführen. Dies lässt sich in C# sehr einfach über die
HttpWebRequest
-Klasse lösen:
Quelltext per HttpWebRequest einlesen
Noch kompakter lässt sich das Ganze mit Hilfe der Klassen 01020304050607
HttpWebRequest request = HttpWebRequest.CreateHttp("http://domain.tld/");
using(WebResponse response = request.GetResponse()) { using(StreamReader streamReader = new StreamReader(response.GetResponseStream())) { string content = streamReader.ReadToEnd(); }}
WebClient
oder HttpClient
lösen:
Quelltext per WebClient oder HttpClient einlesen
Abschließend sei bemerkt, dass diese Möglichkeit nicht für fragliche Aktionen genutzt werden sollte – dazu gehört im Übrigen auch schlicht unnötiger Traffic. 010203040506070809101112131415161718
// WebClientusing(WebClient webClient = new WebClient()) { // blockierend string content = webClient.DownloadString("http://domain.tld/");
// nicht blockierend webClient.DownloadStringCompleted += (sender, e) => { string content = e.Result; };
webClient.DownloadStringAsync(new Uri("http://domain.tld/"));}
// HttpClientusing(HttpClient httpClient = new HttpClient()) { string content = await httpClient.GetStringAsync("http://domain.tld/");}

(Pseudo) Random Numbers in C#
Sehr häufig benötigt man in div. Anwendungen zufällige Zahlen (oder zumindest solche, die sich hinreichend ähnlich verhalten). Hierfür steht uns in C# die grundlegende Klasse
Die Verwendung gestaltet sich dennoch offensichtlich sehr einfach. Zu berücksichtigen gilt jedoch, dass als Seed standardmäßig ein zeitabhängiger Wert verwendet wird – um dieses Verhalten selbst zu steuern, existiert eine weitere Variante des Konstruktors. Gleiche Startwerte ergeben wie üblich gleiche Sequenzen an Zufallszahlen.
Für sensiblere Anwendungen, beispielsweise zur Schlüsselgenerierung, steht der kryptografische Zufallszahlengenerator
Random
zur Verfügung:
Random-Klasse verwenden
Manche Entwickler sind ggf. erst einmal etwas auf Grund der oberen Grenze verwirrt, welche bei Verwendung der entsprechenden Methoden exklusiv ist. Das bedeutet, dass ihr das eigentlich gewünschte Maximum inkrementiert angeben müsst, sofern dieses ebenfalls enthalten sein soll.0102030405060708091011121314
Random random = new Random();
int randomInt = random.Next(); // Intervall: [0,Int32.MaxValue)int randomIntMax = random.Next(8); // Intervall: [0,8) bzw. [0,7]int randomIntMinMax = random.Next(5, 19); // Intervall: [5,19) bzw. [5,18]
/** * Befüllt "randomData" mit * zufälligen Byte-Werten.**/byte[] randomData = new byte[3];random.NextBytes(randomData);
double randomDouble = random.NextDouble(); // Intervall: [0,1)
Die Verwendung gestaltet sich dennoch offensichtlich sehr einfach. Zu berücksichtigen gilt jedoch, dass als Seed standardmäßig ein zeitabhängiger Wert verwendet wird – um dieses Verhalten selbst zu steuern, existiert eine weitere Variante des Konstruktors. Gleiche Startwerte ergeben wie üblich gleiche Sequenzen an Zufallszahlen.
Für sensiblere Anwendungen, beispielsweise zur Schlüsselgenerierung, steht der kryptografische Zufallszahlengenerator
RNGCryptoServiceProvider
als konkrete Implementierung der abstrakten Basisklasse RandomNumberGenerator
zur Verfügung. Die Verwendung gestaltet sich ähnlich einfach:
RNGCryptoServiceProvider-Klasse verwenden
Weitere sinnvolle Hinweise finden sich in den jeweiligen Klassenbeschreibungen des MSDN. 01020304050607080910111213
using(RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider()) { // 3 Zufallszahlen erzeugen byte[] randomData = new byte[3]; rng.GetBytes(randomData);
// Zufalls-Bytes durchlaufen foreach(byte randomNumber in randomData) { /** * "randomNumber" enthält nun jeweils * eine der erzeugten Zufallszahlen. **/ }}
User Defined Validation in ASP.NET MVC
Sehr praktisch unter ASP.NET MVC sind Attribute zur Validierung in Models. Standardmäßig bietet das .NET-Framework im Namensraum
Manchmal benötigt man jedoch etwas speziellere Validierungen und möchte naheliegenderweise dennoch auf eine einheitliche Vorgehensweise setzen. Hierfür steht das (abstrakte) Attribut
Für unser Beispiel möchten wir ein Attribut zur Validierung implementieren, welches angibt, dass ein Feld (üblicherweise indirekt aus einem Formular vom Benutzer befüllt) mindestens eine Ziffer, zwei Großbuchstaben und drei Kleinbuchstaben enthalten muss. Wir halten es bewusst einfach, um uns auf den Kontext zu konzentrieren:
System.ComponentModel.DataAnnotations
beispielsweise die Attribute Range
, Required
und StringLength
, deren Verwendung wohl selbsterklärend sein dürfte.Manchmal benötigt man jedoch etwas speziellere Validierungen und möchte naheliegenderweise dennoch auf eine einheitliche Vorgehensweise setzen. Hierfür steht das (abstrakte) Attribut
Validation
zur Verfügung, von welchem wir eine konkrete Implementierung für unser Vorhaben ableiten können.Für unser Beispiel möchten wir ein Attribut zur Validierung implementieren, welches angibt, dass ein Feld (üblicherweise indirekt aus einem Formular vom Benutzer befüllt) mindestens eine Ziffer, zwei Großbuchstaben und drei Kleinbuchstaben enthalten muss. Wir halten es bewusst einfach, um uns auf den Kontext zu konzentrieren:
Benutzerdefiniertes Attribut zur Validierung implementieren
Dies ist eine sehr grundlegende Implementierung, die sich durchaus noch erweitern (und optimieren) lässt. Grundsätzlich genügt dieses Vorgehen jedoch bereits, um Verwendung zu finden. Das Attribut wird dazu wie üblich über der entsprechenden Eigenschaft der Model-Klasse deklariert:
010203040506070809101112131415161718
[AttributeUsage(AttributeTargets.Property)]public class PasswordAttribute : ValidationAttribute { public override bool IsValid(object value) { string val = value as string;
if(!String.IsNullOrWhiteSpace(val)) { return ( val.Count(c => Char.IsDigit(c)) >= 1 && val.Count(c => Char.IsUpper(c)) >= 2 && val.Count(c => Char.IsLower(c)) >= 3 ); } else { return false; } }}
Benutzerdefiniertes Attribut zur Validierung verwenden
Eine allgemeine Einführung zum MVC-Framework möchte ich gerne in einem späteren Beitrag liefern. 01020304050607
public class User { [Password] public string Password { get; set; }}
Download File with ASP.NET MVC
Häufig möchte man auf seiner Webpräsenz nicht nur mit HTML-Ansichten arbeiten, sondern beispielsweise auch Dateien zum Herunterladen anbieten. Das ist selbstverständlich auch unter ASP.NET MVC kein Problem, sondern erfordert lediglich eine Aktion mit dem Rückgabetyp
Hierbei handelt es sich jedoch um eine abstrakte (Basis-)Klasse, konkrete Implementierungen stehen mit
FileResult
.Hierbei handelt es sich jedoch um eine abstrakte (Basis-)Klasse, konkrete Implementierungen stehen mit
FileContentResult
, FilePathResult
und FileStreamResult
zur Verfügung. Wir begnügen uns mit einem minimalistischen Beispiel und verwenden FilePathResult
– was soweit selbsterklärend sein dürfte:
Download-Aktion im Controller "Gallery"
Sofern 01020304050607
public class GalleryController : Controller { public FileResult Download() { return new FilePathResult(@"X:\Pfad\zur\Datei\MeinBild.png", "image/png") { FileDownloadName = "Bild.png" // Dateiname für Benutzer festlegen }; }}
FileDownloadName
gesetzt wird, sollte der Browser die Datei automatisch zum Speichern anbieten, ansonsten greift das jeweilige Standardverhalten. Weitere Möglichkeiten bieten euch die bereits erwähnten anderen Implementierungen, natürlich könnt ihr auch jederzeit selbst welche für eure eigenen Bedürfnisse ableiten. Lua Documentation revised
Ich erlaube mir eine kleine Werbung in eigener Sache, da ich nach langer Zeit endlich die Gelegenheit hatte, die Übersetzung der Lua-Dokumentation – wie viele andere Projekte zuvor – von PHP auf ASP.NET MVC umzustellen.
Im Zuge dessen wurde einiges im Hintergrund optimiert, jedoch auch die Darstellung überarbeitet. Darüber hinaus werden nun insbesondere Querverweise auf andere Kapitel und Funktionen endlich (automatisch) verlinkt.
Inhaltlich werde ich an dieser Version wahrscheinlich nichts mehr bearbeiten. Da meine Zeit leider recht verplant ist, kann und möchte ich nicht versprechen, ob eine Übersetzung der aktuellen Dokumentation für v5.2 in absehbarer Zeit machbar ist. Ich hätte jedoch durchaus Interesse daran – evtl. finden sich ja noch Mitstreiter.
In Kürze erscheinen hier auf jeden Fall auch wieder ein paar mehr Artikel zum Thema Softwareentwicklung.
Im Zuge dessen wurde einiges im Hintergrund optimiert, jedoch auch die Darstellung überarbeitet. Darüber hinaus werden nun insbesondere Querverweise auf andere Kapitel und Funktionen endlich (automatisch) verlinkt.
Inhaltlich werde ich an dieser Version wahrscheinlich nichts mehr bearbeiten. Da meine Zeit leider recht verplant ist, kann und möchte ich nicht versprechen, ob eine Übersetzung der aktuellen Dokumentation für v5.2 in absehbarer Zeit machbar ist. Ich hätte jedoch durchaus Interesse daran – evtl. finden sich ja noch Mitstreiter.

In Kürze erscheinen hier auf jeden Fall auch wieder ein paar mehr Artikel zum Thema Softwareentwicklung.
Project links
-
BitStadt – Stadtportal
Berlin · Hamburg · Amsterdam -
CCC – Fahrplan
Schedules for the CCCongress
Categories / Archive | Übersicht
- PHP functions in C# (136)
- Dictionary (257)
Tags
.NET · ADO.NET · Work · ASP.NET MVC · Blog · C# · Generics · Society · Computer Science · Java · LINQ · Logic · Mathematics · Network · PHP · Project · Security · Software development · Studies · Technics · Theory · Web design · WPF