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:
- Menü Datei - Neu - Neues Projekt auswählen
- Auswahl von ASP.NET - Web Service
- Änderung des Speicherortes auf http://localhost/gysev
- 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:
Ein Klick auf "Abfahrtszeit" bewirkt endlich die Möglichkeit, das soeben erstellte Web Service
durch Angabe einer Uhrzeit auch zu testen:
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.
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":
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:
Eine Auswahl per Dropdown-Liste und nachfolgend ein Klick auf den Button fabriziert dann
folgende Ausgabe am Bildschirm:
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:
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
|
 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.
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
see-programming
Home
Programmierung
Philosophie
Referenzen und Projekte
Kontakt
Newsletter
querdenker
Frühere Ausgaben
Impressionen - aus den Tiefen des Netzes
Satire
Impressum
Haftungsausschluss
|