CSharp: Webseiten programmieren in C#

Microsoft bietet ASP.NET 2.0 und dem in der Betaphase gratis erhältlichen Visual Web Developer 2.0 eine prima Alternative zu PHP. Wie Sie mit dem Web Developer und C# eine kleine Web-Applikation programmierern, erfahren Sie in diesem Beitrag.

Web-Entwicklung mal anders. Wer sich bislang mit PHP durch die Web-Programmierung geschlagen hat, ist eingeladen, es einmal mit etwas anderem zu probieren. Der Visual Web Developer ist in der Beta-Phase gratis erhältlich. Sie finden ihn auf der DVD zum Heft. Die Entwicklungsumgebung läuft stabil und erlaubt Ihnen, mit unterschiedlichen Programmiersprachen Web-Anwendungen zu entwickeln. Der Ansatz ist Microsoft-typisch: zuerst basteln Sie die Oberfläche, dann packen Sie Code hinter die Elemente. Wer je mit Visual Basic oder einem anderen Microsoft-Paket programmiert hat, kommt schnell mit dem Web Developer zurecht.

PHP-Kenner werden sich ein wenig umstellen müssen. An den Gestaltungsansatz hat man sich aber schnell gewöhnt. Und der Einstieg in C# fällt mit Kenntnissen in PHP auch nicht so schwer.

C# ist objektorientiert

C# ist objektorientiert. Das klingt schlimmer, als es ist. Sie müssen lediglich die Sichtweise auf Ihre Art von Programmierung ändern. Bislang haben Sie Code beschrieben, der aus Anweisungen und Funktionen besteht. Um beispielsweise einen Text auszugeben, nehmen Sie einfach ein “echo” in PHP und kümmern sich um nichts mehr.

Der objektorientierte Ansatz ist anders. Statt einen Text einfach so auszugeben, erzeugen Sie zunächst ein Objekt. Diesem Objekt weisen Sie einen Text zu, den es anzeigen soll. Zunächst ist das umständlich. Aber Sie haben mehr Kontrolle. Sie wissen, zu welchem Objekt ein Text gehört. Sie können den einmal zugewiesenen Text bequem wieder auslesen und gegebenenfalls ändern.

Außerdem verbessert die objektorientierte Programmierung den Überblick in umfangreicheren Projekten. In einem Content Management System zum Beispiel definieren Sie ein Objekt “Eintrag”. Mit dem objektorientierten Ansatz machen Sie weiter: Um neuen Eintrag zu schreiben, definieren Sie die Methode Eintrag.schreiben(), um ihn zu lesen, verwenden Sie Eintrag.lesen() und so weiter. Und wenn Sie wissen möchten, wie viele Zeichen ein Eintrag hat, dann nehmen Sie Eintrag.zeichenzaehlen().

Grundlagen C#

Wer bislang mit PHP programmiert hat, muss noch einen Unterschied verkraften: Es gibt keinen Datentyp “Variant”, wie er bei PHP üblich ist. Sie können also nicht einfach einer Variable wahlweise einen String, eine Ganzzahl oder einen Fließkommawert zuweisen.

Bei C# geht das nicht. Die Sprache setzt auf Typensicherheit und zeigt sich da auch ziemlich stur. Das mag anfangs lästig sein. Aber bei größeren Projekten erspart Ihnen das eine Menge Fehler und Probleme.

Weiterer Unterschied: Bevor Sie eine Variable verwenden dürfen, müssen Sie diese deklarieren. Dazu schreiben Sie zunächst den Datentyp und danach den Namen der Variablen, zum Beispiel:

string Name;

Damit erzeugen Sie eine Variable vom Typ “string”, die Text enthalten darf. Eine Variable zum Aufnehmen von Zahlenwerten, deklarieren Sie mit

int Einkommen;

Der Variablentyp “int” erlaubt aber nur ganzzahlige Werte aufzunehmen. Soll es eine Zahl mit Kommastellen, also ein Dezimalbruch sein, deklarieren Sie die Variable mit

double Einkommen;

Um den Code noch ein wenig sicherer zu machen, unterscheidet C# zwischen Groß- und Kleinschreibung. Die Variable

int Test;

ist eine ganz andere als

int test;

Sobald Sie eine Variable in der falschen Schreibweise ansprechen, wird sich der Compiler beschweren. Auch bei den Aufrufen von Methoden müssen Sie auf die korrekte Schreibweise achten. Aber keine Angst: Die Entwicklungsumgebung hilft Ihnen dabei.

Ansonsten sollten Sie mit Ihren PHP-Kenntnissen in C# einen guten Einstieg finden. Die Bedingungs- und Schleifen-Konstruktionen sind praktisch gleich.

Genug Theorie. Jetzt geht es an die Arbeit. In diesem kleinen Kurs schreiben Sie ein Programm, das die Rückgabe-Codes von Webseiten auswertet. Denn der Server gibt im Header jeder übertragenen Webseite einen numerischen Code an, der besagt, ob die Aktion Erfolg hat oder nicht. Aus dem Alltag im Web kennen Sie die Fehlercodes, etwa “404 – Not Found”. Wenn aber eine Seite korrekt gefunden wird, kommt auch ein Code: Dann ist es die 200. Oder Sie stoßen auf eine Umleitung. Dann erscheint für einen permanenten Redirect eine 301 und für einen temporären Redirect eine 302. Und genau hier wird es interessant: Wenn ein Webmaster seine Besucher umleitet, gibt der Server diese Codes zurück. So können Sie beispielsweise prüfen, ob Ihre eigenen Umleitungen korrekt funktionieren.

Starten Sie den Visual Web Developer. Wählen Sie File – New – Web Site. Verwenden Sie das vorgegebene Template ASP.NET Web Site und schalten Sie unter Language auf Visual C#. Die Location bleibt in diesem Beispiel auf File System. Geben Sie danach noch einen aussagekräftigen Verzeichnisnamen für den Projektordner ein.

Nach einem Klick auf Ok geht es los. Sie sehen ein Code-Grundgerüst für die Seite und klicken gleich auf Design links unterhalb des Codefensters.

Jetzt dürfen Sie sich als HTML-Designer austoben. Eine kleine Überschrift, ein bisschen Farbe, vielleicht ein Bild? Wenn Sie sich ausgetobt haben, brauchen Sie noch genau zwei Textboxen und einen Button. Mehr zum Thema “Seitengestaltung mit Visual Web Developer” lesen Sie in.

Die erste Textbox ist einzeilig und wird den Namen der zu überprüfenden Seite aufnehmen. Klicken Sie auf die Box und sehen Sie in den Properties unter Misc nach. Falls Sie die Properties nicht sehen, drücken Sie einmal auf die Taste [F4].

Geben Sie als ID für die Textbox txtURL ein. Unter diesem Namen ist diese Box später erreichbar. Gleich rechts daneben setzen Sie einen Button. Den nennen Sie btnGo und geben unter Text eine Beschriftung ein, zum Beispiel “Los!”.

Danach bauen Sie unterhalb der beiden Elemente noch eine weitere Textbox. Die darf ruhig etwas größer sein und mehrere Zeilen umfassen. Nennen Sie diese Box txtOutput. Stellen Sie danach in der Eigenschaft TextMode den Wert MultiLine ein. Damit ist die Design-Arbeit schon erledigt und Sie können sich dem Programm zuwenden.

Das Programm dahinter

Klicken Sie doppelt auf den Los!-Button. Die Entwicklungsumgebung zeigt Ihnen daraufhin die Ansicht für den Programmcode.

Im geöffneten Code-Fenster gehen Sie zunächst ganz nach oben. Dort fügen Sie die Zeilen

using System.Net;

ein. Die benötigen Sie, um Anfragen im http-Protokoll zu senden und die Antworten zu verarbeiten.

Weiter geht es ein paar Zeilen weiter unten. Fügen Sie unterhalb von

public partial class _Default : System.Web.UI.Page

die Zeilen

HttpWebRequest hwrq;

HttpWebResponse hwrs;

hinzu. Das sind die für den http-Datenverkehr notwendigen Objekte. Sie werden für die Anfrage beim Server und für den Empfang der Antwort zuständig sein.

Die Methode Page_Load kann in diesem Programm leer bleiben. Gleich darunter schreiben Sie die Methode checkHeader(), das Kernstück unseres Programms.

Zunächst leeren Sie das Ausgabe-Textfeld – nur für den Fall, dass vom vorherigen Durchlauf noch ein Ergebnis übrig ist. Dazu weisen Sie dem Objekt txtOutput über die Eigenschaft Text einen Leerstring zu.

Als nächstes untersuchen Sie den Text im Eingabefeld. Mit der Methode StartsWith schaut das Programm nach, ob am Anfang der eingegebenen URL ein “http://” oder ein “https://” steht. Falls nicht, wird ein “http://” vorne angehängt. Das Verknüpfen von Zeichenketten geschieht in C# übrigens mit einem Pluszeichen, nicht mit einem Punkt wie in PHP.

Csharp in Visual Studio.NET mit automatischer Syntaxergänzung

Danach geht es weiter in der geheimnisvollen Welt der Fehlerbehandlung. Die geschieht in C# über try – catch-Konstrukte, wie sie auch in Java oder in PHP 5 vorkommen. Das Konzept dahinter: Wir probieren etwas aus, englisch “try”. Geht es schief, fängt eine Fehlerbehandlung den Fehler auf, englisch “catch”, und wertet den Fehler aus. Freundlicherweise übernimmt das .NET-Framework diese Auswertung und ergreift die notwendigen Maßnahmen. Natürlich können Sie selbst diese Fehlerauswertung beeinflussen. Dazu im nächsten Abschnitt mehr.

Zunächst kommt innerhalb von try die Anweisung zum Erzeugen der Web-Anfrage:

hwrq = (HttpWebRequest)WebRequest.Create(txtURL.Text);

Als Parameter übernimmt die Anfrage den Text aus dem Texteingabefeld. Wichtig: Die Abfrage wird zu diesem Zeitpunkt noch nicht ausgeführt.

Damit der Antwort-Code korrekt ausgewertet wird, muss das Programm noch die automatische Umleitung ausschalten. Ansonsten würde ein 301-Redirect die Anfrage umleiten und das Programm würde schließlich ein “200 OK” erhalten. Das verfälscht das Ergebnis. Also schreiben Sie in die Zeile darunter

hwrq.AllowAutoRedirect = false;

So gibt es keine Umleitung und das Programm erhält den Original Antwortcode.

Jetzt holen Sie sich endlich die Antwort des Servers. Das erledigt die Methode GetResponse():

hwrs = (HttpWebResponse)hwrq.GetResponse();

Das Ergebnis geht an das Objekt hwrs. Die nächste Zeile holt aus hwrs den StatusCode und wandelt ihn mit ToString in eine Zeichenkette um. Das ist notwendig, damit das Ergebnis auch an das Textfeld txtOutput übergeben werden kann.

Einiges Kopfzerbrechen hat folgendes Problem bereitet: wird der Statuscode nur mit ToString() umgewandelt, so erscheint statt des Nummerncodes die ausgeschriebene Meldung. Statt einer “200” sehen Sie “Ok”. Beheben lässt sich das mit dem Formatierungsparameter “D”. Der zeigt das Ergebnis als Dezimalzahl:

txtOutput.Text = hwrs.StatusCode.ToString(“D”);

Gleich dahinter schreibt das Programm – diesmal ist es so gewollt – den ausgeschriebenen Code mit

txtOutput.Text += ” ” + hwrs.StatusDescription;

So weit ist der Weg klar, wenn keine Fehler auftreten. Falls es jedoch dazu kommt, muss man den Error abfangen.

Das knifflige bei diesem Programm: Gibt der Server auf GetRepsonse() einen Fehlercode wie “404 Not Found” zurück, so ist das auch für das Programm selbst ein Fehlerfall. Der muss abgefangen und ebenfalls ausgegeben werden. Darüber hinaus gibt es noch eine zweite Art von Fehlern, mit denen man rechnen muss: Der Server ist nicht erreichbar oder der Benutzer hat sich bei der Eingabe der Adresse vertippt. Schließlich kann es auch noch wegen eines übersehenen Programmierfehlers eine Ausnahme erzeugen. Deshalb sollte auch noch immer eine allgemeine “Exception” deklariert sein.

Doch der Reihe nach. Zunächst fangen Sie Fehler ab, die mit der Verbindung zum Internet zu tun haben. Das geschieht innerhalb von

catch (WebException wex)

Den Fehler selbst finden Sie im Parameter wex wieder. Ob es sich um einen vom Server gemeldeten Fehlercode handelt, klären Sie mit

if (wex.Status == WebExceptionStatus.ProtocolError)

Dieser Protocol Error tritt dann auf, wenn zwar eine Antwort vom Server kommt, diese aber eine Fehlermeldung des Servers enthält. Kommt es zu so einem Fehler, wird er ausgelesen und in das numerische Format gewandelt. Gleich darauf erscheint noch der ausgeschriebene Fehlercode:

txtOutput.Text = ((HttpWebResponse)wex.Response).StatusCode.ToString(“D”);

txtOutput.Text += ” ” + ((HttpWebResponse)wex.Response).StatusDescription;

Beachten Sie die Klammersetzung um ((HttpWebResponse)wex.Response). Sind die Klammern nicht gesetzt, meldet der Compiler einen Fehler.

Damit sind alle Statuscodes abgehandelt. Bleiben noch andere Fehler in der Kommunikation mit dem Netz. Die fängt das else ab und zeigt sie im Textfeld für die Ausgabe an.

txtOutput.Text = “HTTP-Fehler: ” + wex.Message;

Bleiben noch alle anderen Fehler. Die holt sich

catch (Exception ex)

und gibt sie ebenfalls in der Ausgabe-Textbox zum Besten.

Damit ist das Kernprogramm schon fertig. Nun müssen Sie nur noch die Konstruktion

protected void btnGo_Click(object sender, EventArgs e)

mit Leben erfüllen. Schreiben Sie dort einfach den Aufruf

checkHeader();

hinein. Ein Klick auf den Button setzt das Programm in Gang.

Ausprobieren

Um das fertige Programm auszuprobieren, drücken Sie die Taste [F5]. Im Normalfall erscheinen gleich danach einige Fehlermeldungen. Mit einem Doppelklick auf eine Meldung springen Sie direkt zu der Programmzeile, in der das Problem auftritt und können den Fehler beheben.

Kommen endlich keine Fehlermeldungen mehr, fragt der Web Developer, ob die Seite im Debugging-Modus gespeichert werden soll. Bestätigen Sie diese Meldung. Sobald Sie die fertige Seite auf den Server packen, sollten Sie allerdings das Debugging ausschalten.

Nach einiger Zeit erscheint der Browser mit der richtigen Seite auf Ihrem Bildschirm. Geben Sie hier die Adresse ein und klicken Sie auf Los. Das Programm baut eine Verbindung zu Internet und Server auf und wird Ihnen den Statuscode präsentieren.

Hosting für ASP.NET

Einen Provider für PHP-Projekte zu finden ist kein Problem. Knapper ist das Angebot für ASP.NET-Server. Doch auch solche Angebote gibt es – sogar umsonst. Schauen Sie nach im Netz auf der Seite

http://www.microsoft.com/germany/webplatform/beta2hosting.mspx

Dort finden Sie die kostenfreien Angebote. Die haben in der Regel nur begrenzten Speicher und keine eigene Domain. Außerdem sind die Angebote auf die Dauer der Betaphase begrenzt. Aber die Gratis-Angebote reichen allemal, um in Ruhe ASP.NET 2.0 und die eigenen Entwicklungen auszuprobieren. Ist dann der Schritt zur Live-Anwendung geschafft, bieten die Provider an, auf eine eigene Domain und ein üppigeres Angebot umzusteigen. Dann allerdings werden Gebühren fällig. Centron (www.centron.de) bietet für 9,95 Euro im Monat und 19,95 Euro Einrichtungsgebühr vollwertiges Hosting an mit 100 MByte Webspace und 10 MByte Speicher in der MSSQL-Datenbank.

Listing

using System;

using System.Data;

using System.Configuration;

using System.Net;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page

{

HttpWebRequest hwrq;

HttpWebResponse hwrs;

protected void Page_Load(object sender, EventArgs e)

{

}

public void checkHeader()

{

txtOutput.Text = “”;

if ((!txtURL.Text.StartsWith(“http://”)) && (!txtURL.Text.StartsWith(“https://”)))

{

txtURL.Text = “http://” + txtURL.Text;

}

try

{

hwrq = (HttpWebRequest)WebRequest.Create(txtURL.Text);

hwrq.AllowAutoRedirect = false;

hwrs = (HttpWebResponse)hwrq.GetResponse();

txtOutput.Text = hwrs.StatusCode.ToString(“D”);

txtOutput.Text += ” ” + hwrs.StatusDescription;

}

catch (WebException wex)

{

if (wex.Status == WebExceptionStatus.ProtocolError)

{

txtOutput.Text = ((HttpWebResponse)wex.Response).StatusCode.ToString(“D”);

txtOutput.Text += ” ” + ((HttpWebResponse)wex.Response).StatusDescription;

}

else

{

txtOutput.Text = “HTTP-Fehler: ” + wex.Message;

}

}

catch (Exception ex)

{

txtOutput.Text = “”;

txtOutput.Text = “ERROR: “;

txtOutput.Text += ex.Message;

}

}

protected void btnGo_Click(object sender, EventArgs e)

{

checkHeader();

}

}

Weblinks

Mission bessere Websites: Einstiegseite in die Arbeit mit dem Visual Web Developer

Dotnetframework.de: Umfangreiche Informationen zum .NET-Framework

Mycsharp.de: Community für C#

ASP heute:Fachartikel rund um ASP

Ähnliche Beiträge