Announcement

Collapse
No announcement yet.

Anfängerprobleme mit SOAP unter .NET

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Anfängerprobleme mit SOAP unter .NET

    Hallo!

    Ich bin in Sachen .NET noch totaler Neuanfänger. Ich komme aus dem Bereich der Java-Entwicklung, weswegen ich mit der Umstellung auf C# bis jetzt überhaupt keine Probleme hatte. Gerade lese ich mir ein wirklich nur kleines Tutorial in Bezug auf WebServices durch. Mit Java habe ich schon mehrere Services und Clients geschrieben - nun möchte ich gern mit .NET und C# ein simples "hello world" als Einstieg erstellen. Da ich noch nichts konkretes mache, habe ich an der Arbeit z.zt. auch nur das "Visual C# 2005 Express".
    Mein Problem beim implementieren eines SOAP-Clients ist es, dass ich keinerlei System.Web.* Namespaces zur Verfügung habe. Die Frage ist nun, ob das eine Beschränkung seitens Microsoft in Bezug auf die kostenlose Entwicklungsumgebung ist, oder ob ich einen Fehler bei der Installation gemacht haben könnte.

    Für Hilfen wäre ich sehr dankbar.

    Viele Grüße,
    Martin

  • #2
    Hallo,

    die kostenfreien Express-Editionen von Visual Studio 2005 gibt es in 2 Ausführungen:

    1. Visual Web Developer (C# und VB) nur für ASP.NET-Anwendungen

    2. Visual C# Express oder Visual Basic 2005 Express für Windowsanwendungen (aber ohne ASP.NET)

    Mein Problem beim implementieren eines SOAP-Clients ist es..
    Für das Schreiben eines ASP.NET XML Web Services sowie für die Client-Anbindung ist Visual Studio nicht notwendig, alle technischen Voraussetzungen deckt bereits das kostenfreie .NET Framework SDK ab. VS 2005 erhöht nur die Produktivität.

    Wenn der Web Service läuft und die WSDL-Beschreibung als Datei gespeichert werden kann, kann WSDL.EXE genutzt werden, um den Sourcecode der Proxyklasse zu generieren, der Kommandozeilen-Kompiler baut daraus eine Assembly-DLL, die dann vom Client direkt eingebunden wird:

    wsdl /language:CS /out:OSFirstWSStub.cs OSFirstWS.wsdl
    csc /target:library OSFirstWSStub.cs

    Comment


    • #3
      Sorry wenn das für mich ein wenig zu kompliziert für den Anfang ist. Ich brauche zum Einstieg in diese ganze Windowsprogrammierung erstmal simple Beispiele die möglichst wenig generierten Code enthalten die soetwas nur unnötig komplizierter machen. Ich muss das Prinzip verstehen.
      Ich habe bereits einen WebService mit einer einzeigen Methode zum Testen laufen (dies ist mit Java entwickelt und läuft unter Tomcat). Diese Methode heisst "public String sayHello(String text)" und liefert nichts weiter als "hello " + text. Auf diesen Service möchte ich nun per .NET zugreifen. Also ausschließlich den Client programmieren. Laut dem Tutorial hier muss ich dazu eine Klasse schreiben, die von System.Web.Services.Protocols.SoapHttpClientProtoc ol abgeleitet ist. Und dieser Namespace steht mir nicht zur Verfügung. In Java schaut der Testcode beispielsweise so aus:

      String endpoint = "http://localhost:8080/soaptest/services/Hello";
      Service service = new Service();
      Call call = (Call)service.createCall();
      call.setTargetEndpointAddress(endpoint);
      call.setOperationName(new QName("", "sayHello"));
      String response = (String)call.invoke(new Object[] {"Martin"});
      System.out.println(response);

      Das ist schon alles. Von so einem Code lerne ich mehr als von Proxy-Klassen die ich einfach nur verwende und wo ich nicht weiss, was geschieht. Nur hätt ich das jetzt gern per .NET in C# gemacht und komme einfach nicht an den geforderten Namespace heran. Geht das nun nur mit der "Visual Web Developer" Edition? Kann ich mir nicht vorstellen - denn bei MS wird dieses Programm beschrieben als Entwicklugnsumgebung von dynamischen Webseiten (ASP.NET eben) was mit SOAP nichts zu tun hat.

      Gruß,
      Martin

      Comment


      • #4
        Hallo,

        In Java schaut der Testcode beispielsweise so aus...
        der Vorteil von .NET liegt doch gerade darin, dass zahlreiche Klassengeneratoren zur Verfügung stehen, die immer wiederkehrende Aufgaben im Hintergrund automatisch erledigen. Ein Web Service muss sein Interface in einer maschinenlesbaren Form (WSDL) veröffentlichen. Daher kann das zuständigen Tool aus dem .NET Framework SDK den Quelltext für die Proxyklasse automatisch generieren, so dass der Entwickler den direkten Aufruf der Web Service-Methoden nicht mehr selbst schreiben muss.

        Von so einem Code lerne ich mehr als von Proxy-Klassen die ich einfach nur verwende und wo ich nicht weiss, was geschieht.
        Der C#-Quelltext der von wsdl.exe generierten Proxy-Klasse liegt doch als Datei vor, so dass man dort genau nachsehen kann, wie viel Arbeit der Generator abgenommen hat :-)

        Und dieser Namespace steht mir nicht zur Verfügung
        Wenn das .NET Framework auf dem Rechner installiert ist, kann eine .NET-Anwendung alle Assemblies nutzen. Bei Visual Studio sind der Projektvorlage nur die wichtigsten Assemblies als Vorbelegung zugeordnet, so dass man dem Projekt bei Bedarf die notwendige Assembly nachträglich als Verweis (Reference) zuordnen muss, damit die dort vorkommenden Namespaces vom Kompiler gesehen werden können. Da im .NET Framework SDK auch die Kommandozeilen-Kompiler dabei sind, kann man unabhängig von der Express-Edition in jedem Fall uneingeschränkt auf die volle Funktionsbandbreite von .NET zugreifen.

        Die folgende Beschreibung (das Minimal-Beispiel stammt noch aus den Anfangstagen vom .NET Framework 1.0) kommt ausschließlich mit den frei verfügbaren Werkzeugen aus dem .NET Framework SDK aus. Visual Studio wird nicht verwendet.

        Schritt 1: Der ASP.NET XML Web Service

        <div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"><p style="margin: 0px;">&lt;%@ WebService Language=<span style="color: #a31515;">"c#"</span> Class=<span style="color: #a31515;">"OSMyFirstWebService"</span> %&gt;</p><p style="margin: 0px;"><span style="color: blue;">using</span> System;</p><p style="margin: 0px;"><span style="color: blue;">using</span> System.Web.Services;</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: blue;">public</span> <span style="color: blue;">class</span> OSMyFirstWebService {</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp; [WebMethod]</p><p style="margin: 0px;">&nbsp; <span style="color: blue;">public</span> String HelloWebService( String str )</p><p style="margin: 0px;">&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">return</span> str + <span style="color: #a31515;">" (WebService)"</span>;</p><p style="margin: 0px;">&nbsp; }</p><p style="margin: 0px;">}</p></div>

        Jeder ASP.NET XML Web Service liefert immer dann seine WSDL-Beschreibung zurück, wenn ?WSDL übergeben wird:

        Code:
        http://localhost/OSWS/OSFirstWS.asmx?WSDL
        Die Zeichenkette mit der WSDL-Beschreibung des Interfaces des Web Services wird über den Internet Explorer abgefordert und als Datei gespeichert.


        Über das das .NET Framework-Tool wsdl.exe wird die WSDL-Beschreibung (XML-Format) in eine Stub-Klasse umgewandelt, die als Proxy den Zugriff auf den Web Service (Request/Response) transparent kapselt (REST vs. SOAP beziehungsweise RPC/encoded vs. document/literal):

        Code:
        C:\Artikel\WebServiceClient>wsdl /language:CS /out:OSFirstWSStub.cs OSFirstWS.wsdl
        Die von wsdl.exe generierte Stub-Klasse wird über den Kommandozeilen-Compiler csc.exe in eine Assembly-DLL compiliert:

        Code:
        C:\Artikel\WebServiceClient>csc /target:library OSFirstWSStub.cs
        Der C#-Client beschränkt sich auf nur wenige Programmzeilen, wenn es sich um eine Konsolen-Anwendung handelt:

        <div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"><p style="margin: 0px;"><span style="color: blue;">using</span> System;</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: blue;">class</span> OSClientWebService</p><p style="margin: 0px;">{</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; OSMyFirstWebService aWS = <span style="color: blue;">new</span> OSMyFirstWebService();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"Ergebnis:"</span> + aWS.HelloWebService(<span style="color: #a31515;">"Test"</span>));</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">}</p></div>

        Die anzufordernde Klasse OSMyFirstWebService stammt aus der im Schritt 3 compilierten Proxy-Assemby OSFirstWSStub.dll, so dass diese beim Compilieren ebenfalls als Referenz dem C#-Programm hinzugefügt werden muss:

        Code:
        C:\Artikel\WebServiceClient>csc /target:exe /reference:OSFirstWSStub.dll CltOSFirstWS.cs

        Wenn der Client gestartet wird, gibt er das Ergebnis des Web Services aus.
        Zuletzt editiert von Andreas Kosch; 07.02.2007, 09:24.

        Comment


        • #5
          Originally posted by Andreas Kosch View Post
          Bei Visual Studio sind der Projektvorlage nur die wichtigsten Assemblies als Vorbelegung zugeordnet, so dass man dem Projekt bei Bedarf die notwendige Assembly nachträglich als Verweis (Reference) zuordnen muss, damit die dort vorkommenden Namespaces vom Kompiler gesehen werden können
          Ahhhhh... Diese Information hat mir gefehlt und schon komm ich auch mit dem Rest klar. Ich danke Dir für Deine komplette und ausführliche Beschreibung! Ich habe mir jetzt mit dem Tool wsdl.exe eine Proxy-Klasse erstellen lassen und verwendet. Klappt bestens! Nochmals danke!

          Viele Grüße,
          Martin

          Comment

          Working...
          X