Dynamischer Webservice mit WSDL-Proxy in C#

Wenn man Webservices verwenden möchte, dann hat man sehr komfortabel im VS die Möglichkeit, diesen über einen Webverweis im VS hinzuzufügen.
Danach kann man ihn wie eine normale Klasse verwenden.
Das Problem hierbei: es funktioniert nur mit einem Webservice, genauer gesagt mit einer einzigen URL.
Nun habe ich aber einen Webservice auf 3 verschiedenen Servern – und möchte nicht 3 verschiedene Client-Programme benutzen.

Abhilfe schafft hier ein Wdsl-Proxy, welcher die Methoden und Eigenschaften des Webservices lokal als Klasse zur verfügung stellt.
Im Konstruktor dieser Klasse kann man dann die URL des Webservices übergeben, welchen man dann verwenden möchte.

Hierzu gibt es im .NET Framework-SDK ein Programm namens wsdl.exe.
Dieses befindet sich bei mir dort: D:\Programme\Microsoft Visual Studio 8\SDK\v2.0\Bin\wsdl.exe
Wsdl.exe generiert automatisch eine Proxy-Klasse für den Zugriff auf einen Webservice anhand der WSDL-Daten.

Der Aufruf erfolgt so:

wsdl.exe /language:CS /n:"tA.WS.TrackTracing" http://demo.ttest.de/test/soap/server2.php?wsdl

Folgende Information zu den Parametern:

  • /language:CS: Es soll eine C#-Klasse zurück gegeben werden
  • /n:“tA.WS.TrackTracing“: Der Namespace des Webservices
  • http://213.23.177.36/test/soap/server2.php?wsdl: Die WSDL-Beschreibung des Webservices

Als Resultat bekommt man eine C#-Datei (trecking_wsdl.cs), in der die Proxy-Klasse für den Zugriff liegt.
Diese Datei kann nun als vorhandenes Element in das bestehende Projekt eingefügt werden.

Den Konstruktor der Datei sollte man ändern, um dynamisch arbeiten zu können:
Von:

1
2
3
4
public trecking_wsdl() 
{
    this.Url = "http://demo.ttest.de/test/soap/server2.php";
}

Auf:

1
2
3
4
public trecking_wsdl(string WebserviceURL) 
{
    this.Url = WebserviceURL;
}

Eine Beispiel-Windows-Anwendung könnte z.b. So aussehen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Windows.Forms;
using tA.WS.TrackTracing;
 
namespace wsdltest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            trecking_wsdl ttwsdl = new trecking_wsdl("http://demo.ttest.de/test/soap/server2.php");
            MessageBox.Show(ttwsdl.test("Uebergebener Inhalt..."));
        }
    }
}

leave your comment

*

Unterstütze den Frickelblog!