Querdenker - das Online-Magazin mit News zum Nachdenken
Nr. 9 - Juli/August/September 2002 - Bedenkenswertes, Erlesenes und Quergedachtes
Linie horizontal

Web Services mit .NET realisieren -
Ein Beispiel unter ASP.NET und VB.NET

Der von den Großkonzernen wie Microsoft, Sun oder IBM entfachte Hype um Web Services wird langsam von der Realität eingeholt und beginnt mehr an der Praxis orientierte Züge anzunehmen. Nicht nur, dass sich die von MS und IBM gegründete "Web Services Interoperability Organization" vornehmlich um die Entwicklung von Sicherheitsstandards in Bezug auf Web Services kümmern wird, man will auch Sorge tragen, dass der besondere Kern der "Webdienste", nämlich Kompatibilität auf unterschiedlichsten Plattformen, gewährleistet bleibt. Langsam, aber sicher beginnen sich auch künftige Einsatzgebiete für über das Internet abrufbare Web Services abzuzeichnen.

Google bricht den Bann

Der von vielen Entwicklern zunächst belächelte Hype rund um die Webdienste beginnt nunmehr langsam tatsächlich Auswirkungen auch auf das reale Leben eines Programmierers zu haben, auch wenn viele IT-Consulting-Firmen davon ausgehen, dass die Blütezeit der Web Services nicht vor 2004 beginnen wird. Diese Einschätzung sehen wir als recht realistisch an, auch angesichts dessen, dass viele Kunden erst von der Technologie überzeugt werden müssen. Denn: Das Konzept des Datenaustausches zwischen verschiedenen Computern - ein Merkmal der Web Services - ist nun alles andere als neu.

Über Jahre wurden Technologien wie DCOM und Remote Data Services als das Non Plus Ultra für verteilte Anwendungen gesehen. Die Zeit und die Technik ändern sich. Web Services versprechen, mit den Nachteilen obiger Technologien aufzuräumen. Der Suchgigant Google sorgt nun mit der Einführung seiner Google Web APIs dafür, dass Web Services einen ersten Schub vorwärts erhalten: Die Web APIs als Web Service zeigen einen sinnhaften Einsatz von Webdiensten, die es ermöglichen, eine Integration von Googles Suchtechnologie in eigene Webseiten oder Anwendungen voranzutreiben, ohne dass hiefür allzuviel Aufwand getrieben werden muss.

Blitzkurs in Sachen Web Services-Technologie

Der große Vorteil von Web Services liegt darin, dass sich der Entwickler und das Projektteam keinerlei Gedanken über den verwendeten Client des Users machen müssen. Web Services verteilen die bereitgestellten Daten und Funktionalitäten an nahezu beliebige Client-Plattformen. Dies wird durch die ausschließliche Verwendung von etablierten Standards erreicht, wie etwa XML. Der jeweilige Web Service besteht grundsätzlich aus drei primären Komponenten, dem SOAP-Listener, dem Business-Logik-Objekt und letztlich einer Web Service-Beschreibung (DISCO).

Fertig eingerichtete Web Services und deren Kunden, also die Clients, kommunizieren miteinander über ein relativ einfaches Protokoll, dem Simple Object Access Protocol (SOAP). SOAP erlaubt dabei dem Client den Verbindungsaufbau zum Web Service per standardisiertem Protokoll, beispielsweise über HTTP. Es ist daher im Gegensatz zu den bisherigen Technologien wie etwa DCOM nicht notwendig, dass am Server zusätzliche offene Ports konfiguriert werden müssen, die naturgemäß auch ein potentielles Sicherheitsrisiko darstellen. Der typischerweise verwendete Port 80 für das HTTP-Protokoll reicht also völlig aus.

Die Geschäftslogik, Business logic, des Web Services, die vom Client aufgerufen wird, kann ein Objekt sein, welches in einem beliebigen Programmiermodell verwirklicht wurde. Dies können ebenso CORBA oder COM-Objekte sein oder auch neue .NET-Komponenten. Auch hier zeigt sich die Unabhängigkeit des Modells der Web Services: Es spielt keine Rolle, ob diese über IBMs Web Sphere oder über Microsofts VS.NET realisiert wurden.

Die dritte Komponente eines Web Services ist schließlich eine "Beschreibungsdatei", die auch als Discovery-File, abgekürzt DISCO, bezeichnet wird. Diese Datei wird vom Entwickler des Clients beim Programmieren benötigt um eine Referenzbeschreibung des Web Services zu erhalten: Welche Parameter erwartet der Web Service, was gibt er an den Client zurück etc. Bei der Erstellung eines Web Services mit Hilfe von Visual Studio.NET und unter den Programmiersprachen VB.NET sowie C# wird diese Datei mit der Endung .vsdisco (unter C lautet die Endung .disco) automatisch erstellt.

Durch die Referenzierung von Visual Studio.NET auf das DISCO-File ist es auch für den Entwickler auf der Client-Seite leichter, da damit auch für das Web Service die Intellisense-Features der Entwicklungsumgebung funktionieren. Der Programmieraufwand ist somit verringert, da dem Client die Methoden und Properties des Web Services übersichtlich dargestellt werden. Mit der Verwendung von Visual Studio.NET verringert sich darüber hinaus der Entwicklungsaufwand um ein Vielfaches, da bei Erstellung eines Web Service-Projektes der dazugehörige SOAP-Listener und das DISCO-File automatisch miterstellt werden.

Web Services - ein einfaches Anwendungsbeispiel

Prinzipiell kann man bei der Entwicklung von Web Services von zwei unterschiedlichen Szenarien ausgehen: Der entsprechenden Web Service-Programmierung für den Server und die clientseitige Implementierung in die eigene Applikation. Für unser kleines, einfaches Beispiel gehen wir für die Programmierung des Web Services von folgendem, durchaus möglichen Szenario aus: Eine lokale Eisenbahngesellschaft, in diesem Fall die "Raaber-Bahn" (eigentlich Raab-Ödenburg Ebenfurther Eisenbahn, ungarisch Gysev; unter Gysev.hu erreichbar), hat beschlossen, Teilausschnitte ihrer Personenzugfahrpläne als Web Services bereitzustellen. Diese sollen in weiterer Folge von lokalen Hotels, Pensionen oder Tourismusbüros auf ihren jeweiligen Webseiten angeboten werden. Dadurch könnte der erlebenisorientierte Feriengast weitere Anregungen für seine Urlaubsgestaltung erhalten. Die Bahngesellschaft könnte wiederum von einer vermehrten Inanspruchnahme ihrer Züge profitieren, während die jeweiligen Hotels Lob für ihr Service lukrieren.

Serverseitige Web Service-Programmierung

Mit Visual Studio.NET gestalten sich die einzelnen Schritte zur Erzeugung eines Web Services recht einfach:

  1. Menü Datei - Neu - Neues Projekt auswählen
  2. Auswahl von ASP.NET - Web Service
  3. Änderung des Speicherortes auf http://localhost/gysev
  4. und letztlich OK anklicken.

Bitte beachten Sie auch, dass sich mit der Veränderung des Speicherortes des Web Service auch der Projektname automatisch mitändert. Für das eigentliche Web Service wird nun von Visual Studio.NET automatisch das Grundgerüst erzeugt und zwar in Form einer Datei mit der Endung .asmx. Genau diese´Datei wird dann auch später vom Client aufgerufen, eine gewünschte Abfahrtszeit eingegeben und der Web Service wird daraufhin eine Liste mit in dieser Zeit verfügbaren Zügen zurückliefern.

Vor der Bearbeitung und Einfügung unseres benötigen Codes benennen wir die amsx-Datei vom automatisch vergebenen Namen Service1.asmx jedoch durch Auswahl im Solution Explorer bzw. danach durch Eingabe unter Eigenschaften auf Fahrplan.asmx um. Danach öffnen wir das Code-Fenster der nunmehrigen Fahrplan.asmx und ändern den Code bzw. ergänzen diesen, sodass die Datei nun folgenden Quelltext beinhaltet:

Imports System.Web.Services

    <WebService(Namespace:="http://localhost/gysev/")> _
    Public Class Fahrplan
    Inherits System.Web.Services.WebService

    #Region " Web Services Designer Generated Code "

    Public Sub New()
        MyBase.New()

        'This call is required by the Web Services Designer.
        InitializeComponent()

        'Add your own initialization code after the InitializeComponent() call

    End Sub

    'Required by the Web Services Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Web Services Designer
    'It can be modified using the Web Services Designer.  
    'Do not modify it using the code editor.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        components = New System.ComponentModel.Container()
    End Sub

    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        'CODEGEN: This procedure is required by the Web Services Designer
        'Do not modify it using the code editor.
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

#End Region

    ' WEB SERVICE EXAMPLE
    ' The HelloWorld() example service returns the string Hello World.
    ' To build, uncomment the following lines then save and build the project.
    ' To test this web service, ensure that the .asmx file is the start page
    ' and press F5.
    '
    <WebMethod()> _
    Public Function Abfahrtszeit(ByVal gewZeit As String) As String
        Dim strfaplo As String
        Select Case gewZeit
            Case 21, 22, 23, 24, 0, 1, 2, 3, 4
                strfaplo = "4.46 Uhr - E 1940 - nach Wien Suedbf(Ost)"
            Case 5
                strfaplo = "5.48 Uhr - E 1942 - nach Wien Suedbf(Ost)"
            Case 6
                strfaplo = "6.51 Uhr - E 1944 - nach Wien Suedbf(Ost)"
            Case 7
                strfaplo = "7.46 Uhr - E 1946 - nach Wien Suedbf(Ost)"
            Case 8
                strfaplo = "8.03 Uhr - R 7951 - nach Pamhagen/Fertoeszentmiklos"
            Case 9
                strfaplo = "9.57 Uhr - R 7952 - nach Bruck/Leitha"
            Case 10
                strfaplo = "10.12 Uhr - R 7953 - nach Pamhagen"
            Case 11
                strfaplo = "11.52 Uhr - R 7954 - nach Neusiedl/See"
            Case 12
                strfaplo = "12.06 Uhr - R 7955 - nach Pamhagen/Fertoeszentmiklos"
            Case 13
                strfaplo = "13.23 Uhr - R 7956 - nach Bruck/Leitha," & _
                           "13.36 Uhr - E 1941 - nach Pamhagen/Fertoeszentmiklos," & _
                           "13.56 Uhr - R 7958 - nach Neusiedl/See"
            Case 14
                strfaplo = "14.10 Uhr - R 7959 - nach Pamhagen," & _
                           "14.52 Uhr - R 7960 - nach Neusiedl/See"
            Case 15
                strfaplo = "15.05 Uhr - R 7961 - nach Pamhagen/Fertoeszentmiklos," & _
                           "15.53 Uhr - R 7962 - nach Neusiedl/See"
            Case 16
                strfaplo = "16.06 Uhr - R 7963 - nach Pamhagen/Fertoeszentmiklos," & _
                           "16.27 Uhr - E 1943 - nach Pamhagen/Fertoeszentmiklos," & _
                           "16.56 Uhr - R 7968 - nach Neusiedl/See"
            Case 17
                strfaplo = "17.09 Uhr - R 7973 - nach Pamhagen," & _
                           "17.27 Uhr - R 1945 - nach Pamhagen," & _
                           "17.54 Uhr - R 7966 - nach Neusiedl/See"
            Case 18
                strfaplo = "18.11 Uhr - R 7965 - nach Pamhagen/Fertoeszentmiklos," & _
                           "18.40 Uhr - E 1947 - nach Pamhagen"
            Case 19
                strfaplo = "19.05 Uhr - R 7967 - nach Pamhagen/Fertoeszentmiklos," & _
                           "19.53 Uhr - R 7972 - nach Neusiedl/See"
            Case 20
                strfaplo = "20.07 Uhr - R 7969 - nach Pamhagen/Fertoeszentmiklos"
        End Select
        Return strfaplo
    End Function
End Class
    

Beim Vergleich mit der ursprünglich erstellten Datei Service1.asmx fallen nur wenige notwendige Änderungen im Code von Fahrplan.asmx auf: Zunächst wurde im Tag <WebService> der Namespace auf localhost/gysev geändert und unterhalb des Tags <WebMethod> eine neue öffentliche Funktion namens Abfahrtszeit eingefügt. Zu obigen Tags könnte man auch noch eine Eigenschaft Description hinzufügen, die in einfachen Worten den Web Service und die Web Methode beschreiben. Hier wurde darauf allerdings verzichtet.

Die "public"-Funktion Abfahrtszeit erwartet die Übergabe des Parameters gewZeit. Der Client soll also zunächst eine gewünschte Fahrzeit eingeben, die dann per Select...Case ausgewertet wird und dementsprechend einen String mit der tatsächlichen Abfahrtszeit, der Zugnummer und dem jeweiligen Fahrziel an den Client zurück gibt. (Für Insider: Es handelt sich hierbei um den Abfahrtsplan der Halte- und Ladestelle Bad Neusiedl am See, allerdings ohne Rücksicht auf beschränkte Verkehrstage.)

Mit Sicherheit wäre an dieser Stelle ein Datenbankzugriff wesentlich besser als die hier praktizierte Form eines Select...Case-Statements. Es geht aber in diesem Artikel um Web Services und nicht um DB-Zugriffe, die bereits in früheren Ausgaben von querdenker anschaulich dargestellt wurden. Damit hat sich die Erstellung des Web Service bereits, ein Klick auf Build Solution und der Web Service Fahrplan ist von der Serverseite her fertig. Jetzt können wir bereits den ersten Test machen, indem wir im Browser das asmx-File direkt aufrufen:

Aufruf der Fahrplan.asmx, des Web Services direkt im Browser

Ein Klick auf "Abfahrtszeit" bewirkt endlich die Möglichkeit, das soeben erstellte Web Service durch Angabe einer Uhrzeit auch zu testen:

Test des Fahrplan-Web Services

Gleichzeitig wird auch der generierte SOAP-Code angezeigt, der die jeweiligen aktualisierten Variablen, z.Bsp. den Header oder auch den erwarteten Parameter inkludiert. Dadurch kann der Client-Entwickler auch ohne Kenntnis des serverseitigen Web Service-Quellcodes seinen Part des clientseitigen Codings beginnen. Nähere Informationen erhalten wir schließlich durch einen Klick auf die Liste der zur Verfügung gestellten Operationen.

Der Test des Web Services kann durch bewusste Falscheingaben auch scheitern, beispielsweise wenn keine Strings übergeben werden. Die Validierung der Eingaben ist jedoch Teil der clientseitigen Entwicklung.

Rückgabewert des Web Services bei Eingabe vom Stringwert 10

Clientseitiger Teil der Web Service-Programmierung

In unserem Beispiel sind wir davon ausgegangen, dass eine Bahnverwaltung (hier die Raab-Ödenburg- Ebenfurther Eisenbahn) ihren Fahrplan als Web Service zur Verfügung stellt. Ein in der Nähe der Bahnstation Bad Neusiedl am See liegendes Hotel möchte nun den Abfahrtsplan der Station auf seiner Webseite nutzen, um den Hotelgästen Ausflugsfahrten in der Region per Bahn schmackhaft zu machen.

Zu diesem Zweck ist nun neuerlich ein neues ASP.NET-Webprojekt in Visual Studio.NET zu starten. Wir haben dieses Projekt "Hotel" genannt. Um nun auf der Webseite das Web Service der Bahnverwaltung nutzen zu können, muss im Projektmappen-Explorer ein Verweis, eine Referenz auf das Web Service erzeugt werden. Dies funktioniert per Rechtsklick auf "References" und Anklicken von "Add Web Reference". Visual Studio.NET bringt nun folgenden "Assistenten":

Visual Studio.NET Assistent zur Erzeugung einer Referenz auf ein Web Service

In der Adressleiste ist die komplette URL des Web Service einzutragen. Danach klicken Sie auf den danebenliegenden grünen Pfeil. Dadurch wird auf das entsprechende .asmx-File und die dazugehörige DISCO-Datei verbunden. Durch den anschließenden Klick auf "Add Reference" wird letztlich erst die endgültige Referenz erstellt und der Web Service dadurch nutzbar. Nebenbei bemerkt: Im Rahmen dieses Assistenten-Bildschirms lassen sich über die UDDI-Datenbanken weitere Web Services ausfindig machen. Derzeit sind allerdings erst zwei derartiger Datenbanken im Netz verfügbar, eine bei Microsoft, die andere bei IBM.

Jetzt fehlt nur noch die fertige Web Seite, die diesen Dienst anbietet. Dazu erstellen wir eine "Abreise.aspx"-Seite und den dazugehörigen "Business-Logik-Teil" als Code-Behind-Datei namens "Abreise.aspx.vb". Der Quelltext von Abreise.aspx sieht so aus:

    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="Abreise.aspx.vb" Inherits="hotel.WebForm1"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
	<HEAD>
		<title>WebForm1</title>
		<meta content="Microsoft Visual Studio.NET 7.0" name="GENERATOR">
		<meta content="Visual Basic 7.0" name="CODE_LANGUAGE">
		<meta content="JavaScript" name="vs_defaultClientScript">
		<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
	</HEAD>
	<body bgProperties="fixed" background="badewanne.jpg" MS_POSITIONING="GridLayout">
		<form id="Form1" method="post" runat="server">
			<asp:label id="Label1" style="Z-INDEX: 101; LEFT: 80px; POSITION: absolute;
			 TOP: 223px" runat="server" Height="138px" Width="577px" 
			 Font-Names="Arial Black" ForeColor="Black">
			 </asp:label>
			 <asp:button id="Button1" style="Z-INDEX: 103; LEFT: 208px; POSITION: absolute; 
			 TOP: 181px" runat="server" Height="28px" Width="173px" 
			 Text="Wann geht mein Zug?" Font-Names="Arial" BackColor="Yellow">
			 </asp:button>
			 <asp:dropdownlist id="DropDownList1" style="
			 Z-INDEX: 102; LEFT: 74px; POSITION: absolute; TOP: 185px" runat="server" 
			 Width="101px" BackColor="#FF8000">
				<asp:ListItem Value="0">0 Uhr</asp:ListItem>
				<asp:ListItem Value="1">1 Uhr</asp:ListItem>
				<asp:ListItem Value="2">2 Uhr</asp:ListItem>
				<asp:ListItem Value="3">3 Uhr</asp:ListItem>
				<asp:ListItem Value="4">4 Uhr</asp:ListItem>
				<asp:ListItem Value="5">5 Uhr</asp:ListItem>
				<asp:ListItem Value="6">6 Uhr</asp:ListItem>
				<asp:ListItem Value="7">7 Uhr</asp:ListItem>
				<asp:ListItem Value="8">8 Uhr</asp:ListItem>
				<asp:ListItem Value="9" Selected="True">9 Uhr</asp:ListItem>
				<asp:ListItem Value="10">10 Uhr</asp:ListItem>
				<asp:ListItem Value="11">11 Uhr</asp:ListItem>
				<asp:ListItem Value="12">12 Uhr</asp:ListItem>
				<asp:ListItem Value="13">13 Uhr</asp:ListItem>
				<asp:ListItem Value="14">14 Uhr</asp:ListItem>
				<asp:ListItem Value="15">15 Uhr</asp:ListItem>
				<asp:ListItem Value="16">16 Uhr</asp:ListItem>
				<asp:ListItem Value="17">17 Uhr</asp:ListItem>
				<asp:ListItem Value="18">18 Uhr</asp:ListItem>
				<asp:ListItem Value="19">19 Uhr</asp:ListItem>
				<asp:ListItem Value="20">20 Uhr</asp:ListItem>
				<asp:ListItem Value="21">21 Uhr</asp:ListItem>
				<asp:ListItem Value="22">22 Uhr</asp:ListItem>
				<asp:ListItem Value="23">23 Uhr</asp:ListItem>
				<asp:ListItem></asp:ListItem>
			</asp:dropdownlist>
			<asp:label id="Label2" style="Z-INDEX: 104; LEFT: 78px; 
			POSITION: absolute; TOP: 127px" runat="server" Width="582px" 
			Font-Names="Arial Black" 
			ForeColor="Yellow">Bitte wählen Sie die gewünschte Abfahrtszeit aus und drücken Sie 
			anschließend den Button:
			</asp:label>
			<asp:Label id="Label3" style="Z-INDEX: 105; LEFT: 337px; POSITION: absolute; 
			TOP: 44px" runat="server" Height="67px" Width="305px" 
			Font-Names="Arial Black" Font-Size="X-Large" 
			ForeColor="Yellow"> Hotel-Zugservice
			</asp:Label>
			</form>
	</body>
    </HTML>
    

Wir verwenden auf dieser "Abreise-Seite" eine Dropdown-Box, damit keine zusätzliche Client-Validierung der Usereingaben notwendig ist. Diese wäre aber zwingend erforderlich, wenn eigene Eingaben der User möglich wären. Jetzt fehlt noch die Code-Behind-Seite, die den Event beinhaltet, nämlich der Klick auf den Button und die darauffolgende Kontaktaufnahme mit dem Web Service. Dies finden Sie in der Datei "Abreise.aspx.vb":

Public Class WebForm1
    Inherits System.Web.UI.Page
    Protected WithEvents Label1 As System.Web.UI.WebControls.Label
    Protected WithEvents Button1 As System.Web.UI.WebControls.Button
    Protected WithEvents Label2 As System.Web.UI.WebControls.Label
    Protected WithEvents Label3 As System.Web.UI.WebControls.Label
    Protected WithEvents DropDownList1 As System.Web.UI.WebControls.DropDownList

    #Region " Web Form Designer Generated Code "

    'This call is required by the Web Form Designer.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

    End Sub

    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
        'CODEGEN: This method call is required by the Web Form Designer
        'Do not modify it using the code editor.
        InitializeComponent()
    End Sub

    #End Region

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Put user code to initialize the page here
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim strfaplo As localhost.Fahrplan
        Const tip = "Abfahrtszeit/Zugnummer/Zugziel"
        strfaplo = New localhost.Fahrplan()
        Label1.Text = tip + "<br><br>" + strfaplo.Abfahrtszeit(Me.DropDownList1.SelectedIndex)
    End Sub
End Class
	

Für unsere Zwecke interessant ist eigentlich nur der Eventhandler "Button1_Click", indem auf den Web Service per Variable strfaplo zugegriffen wird und ansonsten noch eine gewisse Formatierung in die Ausgabe am Client gebracht wird. Der nachstehende Screenshot dokumentiert nun das Ergebnis:

Abreise.aspx-Webseite

Eine Auswahl per Dropdown-Liste und nachfolgend ein Klick auf den Button fabriziert dann folgende Ausgabe am Bildschirm:

Ausgabe vom Web Service Fahrplan

Fazit

Anhand unseres Beispiels konnten Sie ersehen, wie einfach es mit Visual Studio.NET ist, einen funktionierenden Web Service zu kreieren. Zugegeben: Das Beispiel ist sehr einfach und rudimentär gehalten - aber als Anschauung für die Funktionsweise und Aufbau eines derartigen Dienstes ist es sicherlich gut geeignet.

Web Services kommen jetzt langsam, aber sicher in den Mittelpunkt des Programmierlebens. Sie können über die üblichen Mechanismen vom .NET-Framework und ASP.NET ebenso gut abgesichert werden, wie eine Webseite, die nur einem eingeschränkten Publikum zur Verfügung stehen soll. Die dazu notwendigen Verfahren werden wir uns in einem der nächsten Artikel ansehen. An Funktionalität bei Web Services fehlt sicherlich noch die Möglichkeit zur sicheren Datenübertragung - etwa per SSL. Die entsprechenden Gremien, wie etwa die Web Services Interoperability Organization, arbeiten aber an einem gültigen Sicherheitsstandard. Wir glauben jedenfalls daran, dass den Web Services noch eine große Zukunft bevorsteht.

In der nächsten Ausgabe von querdenker:

Sichere Web Services
...und vieles mehr ...ab Oktober 2002

Buchtipp in eigener Sache -
VB.NET - die Migration

Ausnahmsweise machen wir auch einmal Werbung in eigener Sache. Unser Team-Mitglied, Martin Kratschmer, hat ein Buch verfasst, welches im Verlag moderne Industrie/Bonn erschienen ist: "VB.NET - die Migration" (ISBN 3-8266-0843-7), behandelt auf 528 Seiten jenes Kernthema, das Visual Basic-Programmierer in der nächsten Zeit mit Sicherheit freiwillig oder unfreiwillig beschäftigen wird: Wie bringe ich meine VB6-Applikationen erfolgreich in die "neue" .NET-Zeit?

Die drängenden Fragen des VB-Programmierers werden darin behandelt:Buchumschlagvon VB.NET-Die Migration

  • Muss ich auf VB.NET migrieren?
  • Wann lohnt es sich, meine Applikation umzustellen?
  • Wie muss ich VB6-Anwendungen vorbereiten?
  • Welche Änderungen gibt es in VB.NET gegenüber VB6?
  • Was ist mit den Windows Forms?
  • Kann ich meine Steuerelemente weiterverwenden?
  • Was ist mit den entsprechenden Methoden und Eigenschaften?
  • Mein Steuerelement gibt es in VB.NET nicht mehr, was verwende ich jetzt?
  • Was kann der "Upgrade Wizard" automatisch erledigen, was muss manuell gemacht werden?
  • Wie löse ich jene Migrationsprobleme, die der Aktualisierungsassistent nicht schafft?
  • Was sind die "Kompatibilitätsklassen" ?
  • Was sind die Unterschiede im Visual Studio.NET?
  • Welche Tools gibt es, die mir beim Testen und Analysieren von VB.NET helfen?
  • Welche neuen Techniken sind in VB.NET enthalten?
  • Das Buch eignet sich gleichermassen für den Profi und für den Einsteiger, da auch Einführungen in das .NET-Framework (Unterkapitel zu ASP.NET, ADO.NET) und auch zahlreiche Klassen und Namensräume besprochen werden.

    Schritt für Schritt-Anleitungen, viele Grafiken und letztendlich auch der Quellcode auf enthaltener CD-ROM sollen nicht nur dem langjährigen VB-Entwickler, sondern auch dem nicht so erfahrenen Programmierer helfen, anfallende Migrationsarbeiten zügig und erfolgreich zu bewältigen.

    Aufgrund der vielen enthaltenen Tabellen (Übersichten zu Namensräume/Klassen/Controls/Methoden/ Properties zwischen VB6 und VB.NET) erscheint "VB.NET - Die Migration" auch als Nachschlagewerk für die schnelle Migration von VB6 auf VB.NET geeignet. Checklisten, die das Besprochene nochmals zusammenfassen und dem Entwickler an der Hand nehmen bei der Abarbeitung der Migrationsarbeiten runden das Buch ab.

    Kritiken zu VB.NET-Die Migration

    ...habe ich mir ca. 150 Std. Arbeit erspart, die mir entstanden wären, wenn ich nicht vor meiner anstehenden Migration zu VB.NET dieses Buch gelesen hätte...das Buch ist damit unbezahlbar geworden...solche Bücher wünsche ich mir häufiger. (ein Kunde bei Amazon).

    ...Ein Buch über die Migration von VB6 nach VB.NET ist immer auch eine Einführung in die essenziellen Konzepte der .NET-Plattform. Das ist in Martin Kratschmers Buch nicht anders. Seine Arbeit zeichnet aus, dass er sehr übersichtlich VB6-Konstrukte ihren .NET-Entsprechungen gegenüberstellt. Die Codebeispiele beschränken sich nicht auf Fragmente, die nur das eben Erklärte illustrieren sollen, sondern bieten einen schrittweisen Überblick über die Anpassungen, die vorgenommen werden müssen...in ausführlichen Tabellen finden Sie eine Gegenüberstellung der VB6-Form-Properties und ihrer VB.NET-Äquivalente - soweit es welche gibt. Mit dieser praktischen Hilfe werden Ihnen die Fehlermeldungen des Upgrade-Wizards nicht länger geheimnisvoll bleiben. (Basic Bookshop-Newsletter Mai III)

    "VB.NET - die Migration" kostet moderate runde 35 Euro und ist in zahlreichen Fachbuchhandlungen sowie auch über das Internet, beispielsweise bei Amazon, erhältlich.

    VB.NET - die Migration
    Direkte Verlagsbestellung

    Hammer 1

    Meine Meinung -
    Sterbehilfe für Plattenkonzerne?

    Es vergeht mittlerweile kein Tag, an dem der geneigte Musikliebhaber nicht den Kopf über die von den Musikkonzernen verbreiteten Nachrichten schütteln muss. Da wird hemmungslos das Kind mit dem Bade ausgeschüttet - eine kurze Auswahl an "News" aus den letzten Wochen: Musikindustrie stoppt Audiogalaxy, Napster ist tot, US-Musikindustrie experimentiert mit Einmal-CDs oder auch die klassischen Meldungen wie: Raubkopierer (bitte wahlweise einsetzen) zerstören/vernichten/bestehlen Musikindustrie.

    An den Intentionen dieser skurillen Nachrichten lässt sich jedoch eines festmachen: Die bis zum Ende des 20. Jahrhunderts von ständigen Umsatzzuwächsen verwöhnte Musikindustrie zerstört sich selber, benötigt jedoch noch ein wenig Sterbehilfe. In diesem Zusammenhang - auch wenn sich die Selbstdarsteller dieser merkwürdigen Industrie gerne so sehen: Musikindustrie ist nicht gleichzusetzen mit Musik und natürlich auch nicht zu verwechseln mit dem Begriff "Künstler".

    Die lieben Platten-Bosse faseln jetzt seit Jahren von Umsatzeinbussen, Gewinneinbrüchen und machen den Schuldigen auch gleich dingfest: Die bösen Raubkopierer und Nutzer von P2P-Plattformen sind schuld an der Misere! In diesem Bestreben, den Lauf der Dinge festzuhalten und die Situation einzufrieren, macht man vor nichts und niemanden Halt. Mittlerweile ist auch des Konsumenten Recht auf eine private Kopie keineswegs mehr Tabu. "This CD ist not playable on PC or MAC" lautet der kleine Aufdruck auf immer mehr CDs. Wir nähern uns behende dem Zustand der einmaligen Lizenzvergabe, sprich 1x hören, dann Neulizenzierung sprich Neukauf, oder wegschmeissen. Experimente mit CD-Material, die sich nach einmaligem Hören selbst zerstören und den Konsumenten zu anschließendem Besuch auf der Sondermülldeponie zwingen sind bereit erfolgreich vonstatten gegangen. Die Industrie arbeitet hier an der goldenen Esel-Maschine "Konsument" und beweist gleichzeitig, wie wichtig ihr das eigene Produkt ist: 1x kaufen, 1x anhören und wir haben fertig! Diese Richtung scheint symptomatisch für den heutigen Wert des Kulturgutes Musik.

    Hammer 2

    Leider übersieht die Musikindustrie ein paar wesentliche Fakten zu ihrem eigenen Niedergang: Alle relevanten Studien zum Thema Peer-To-Peer-Musikaustauschplattformen beweisen, dass deren Kunden letztlich mehr Geld für CDs ausgeben als vorher. Mit der Abschaltung bzw. Vernichtung durch eine Horde wildgewordener Rechtsanwälte schadet sich die Industrie nur selber. Selbstverständlich landen etwaige Abschlagszahlungen durch die Plattformen niemals beim eigentlichen Künstler. Weiters: Seit Jahren wird von der Industrie kein behutsamer Aufbau von Künstlern oder Bands betrieben, sondern lediglich in immer neue Formen der Verpackung investiert. Dies gipfelt letztlich in den die Charts beherrschenden Retortenbands bzw. den Resteverwertungen a la Samplern. Oder auch in ständigen Cover-Versionen von Uralthits.

    In diesem ständig fabrizierten Musikmüll-Kreislauf zählt nur der sofortige Erfolg und Umsatz. Beständig, über Jahre oder sogar Jahrzehnte verkaufende Bands aus dem Backkatalog der Musikmultis werden da nur mehr belächelt und offenbaren gleichzeitig ein weiteres Problem, welches die zuständigen Herrschaften spätestens in 10 Jahren beschäftigen wird: Der fehlende, verwertbare Backkatalog. Wer heute nur Müll produziert, offenbar nur für den schnellen Wegwerfkonsum bestimmt, dem fehlt in 10 Jahren entscheidendes in den Regalen, nämlich immer wieder, von nachwachsenden Generationen verlangte Musik. Wer kauft sich in 10 Jahren eine CD von Zlatko? Oder vom DJ Popsch? Weitere sinkende Umsätze sind vorprogrammiert...

    Die Antwort der Musikindustrie: Noch schärferen Kopierschutz und letztlich die Abmontierung des Rechts auf die Privatkopie sowie ständige Neulizenzierung. Gemeinsam mit den willfährigen Gehilfen aus der Rechteverwertung wie GEMA oder AKM (österreichisches Pendant), die bereits heute mehr in die Verwaltung investieren als sie an die "Künstler" auszahlen in Verbindung mit unserem uniformen Formatradio, welches bereits mehr an eine Gehirnwäsche des Konsumenten durch das unendliche Abnudeln von den immer gleichen Top 40-Charts erinnert, wird der Musikindustrie sehr bald der Totenschein ausgestellt werden können. Das Beste an dieser Misere ist eigentlich, dass die Industrie a) an ihrer Lage selber schuld ist und b) sie täglich auf das Neue beweist, dass sie im Grunde unnötig ist.

    Die erweiterte Unterhaltungsindustrie möchte da ihren werten Kollegen aus dem Musikbusiness natürlich nicht nachstehen. Dies stellt auch kein Mirakel dar, sind in vielen Fällen doch die gleichen Eigentümer beteiligt. Da wird schon mal eine DVD so mit fehlerhaftem Kopierschutz ausgeliefert, dass nicht mal der Stand Alone- Player mit diesem Sondermüll etwas Anfangen kann. Aktuelles Beispiel: Die Bonus-DVD der Harry Potter-Verfilmung, welche in manchen Versionen (siehe Produktionsnummer an der Innenseite der DVD) mit einem derart fehlerhaftem Kopierschutz "ausgestattet" wurde. Dies stellt allerdings bereits die letzte Stufe der Verwertung durch die Industrie vor: Sondermüll, der nicht einmal mehr konsumiert werden kann, sondern gleich entsorgt werden soll. Offenbar sieht die Industrie ihre Kunden nicht mehr als Konsumenten hochwertiger Unterhaltung, sondern als kostenlose Abfallentsorger, die auch noch dafür bezahlen. Hier drängen sich mir allerdings Parallelen zu jenem Sondermüll auf, den sich Gutgläubige ins WC zur Duftverbesserung hängen.

    Meines Erachtens ist bereits jener Tag abzusehen, an dem die versammelte Musikindustrie um Subventionen vom Staat betteln wird, um jenen von ihnen produzierten aktuellen Musikbrei als öffentliches "Kulturgut" zu bestätigen und den Status Quo zu erhalten. Und ich gehe jede Wette ein, dass bei dieser Gelegenheit wieder keine Rede von den "recording artists" sein wird. Wir sollten dann allerdings bei diesem Spiel nicht mehr mitmachen...

    Martin Kratschmer

    Hammer 3

    see-programming

    Home
    Programmierung
    Philosophie
    Referenzen und Projekte
    Kontakt
    Newsletter

    querdenker

    Frühere Ausgaben

    Impressionen - aus den Tiefen des Netzes

    Satire

    Impressum
    Haftungsausschluss
    Linie horizontal