Entwickler-Ecke

Verteilte Systeme - [CF3.5] Dynamische Webservice URL


DaKirsche - Di 04.06.13 12:27
Titel: [CF3.5] Dynamische Webservice URL
Moin moin,

ich bin ein blutiger Anfänger im Bereich der C# Entwicklung und habe nun die Aufgabe bekommen für ein Windows CE System eine Anwendung zu schreiben, die Daten über einen Webservice auswertet.

Ich habe eine Proxy Klasse über die VS2008 IDE erzeugen lassen.
Die Properties habe ich auf URL-Verhalten = Dynamisch gestellt.

Da ich das CompactFramework nutze habe ich nur eingeschränkte Libraries zur Verfügung.

Zunächst stand ich vor dem Problem, dass ich die Session-ID auswerten muss, was ich im Endefekt dadurch gelöst habe, dass ich den HTTP-Header manuell auslese und erweitere durch eine von der Proxy-Klasse abgeleiteten Klasse.
Das klappt jetzt auch wenigstens gut :)

Mein Problem liegt nun darin, dass ich den Webservice, so wie er erzeugt wurde nur bedingt nutzen kann:

Den Konstruktor habe ich manuell angepasst, um die URL zu übernehmen.

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
public MY_WS_WSDL(String ls_webserviceLocation) {
            this.Url = ls_webserviceLocation+"/MY_WS_WSDL";
        }

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://1.2.3.4:8082/WS2013/MY_WS/CheckPIN", RequestNamespace="http://1.2.3.4:8082/WS2013/MY_WS", ResponseNamespace="1.2.3.4:8082/WS2013/MY_WS", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
        public System.Data.DataSet CheckPIN([System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] string iXMLString, out int sqlcode) {
            object[] results = this.Invoke("CheckPIN"new object[] {
                        iXMLString});
            sqlcode = ((int)(results[1]));
            return ((System.Data.DataSet)(results[0]));
        }

Da mir die IDE entgegen den Beschreibungen im Internet keine Konfigurationsdateien erzeugt übergebe ich die URL als String aus meiner eigenen Anwendungseinstellung

Übergebe ich die Original-URL des Webservices funktioniert alles einwandfrei.

C#-Quelltext
1:
MY_WS_WSDL lsrv_proxy = new MY_WS_WSDL("http://1.2.3.4:8082/WS2013");                    


So funktionert alles ohne Probleme und ich kann meine Request absetzen und Daten empfangen. Mein problem ist aber, dass die Anwendung an verschiedenen Standorten läuft, die den WebService lokal im Netzwerk laufen haben. Daher muss ich die URL dynamisch festlegen können.

Wenn ich nun jedoch folgenden Aufruf mache:

C#-Quelltext
1:
MY_WS_WSDL lsrv_proxy = new MY_WS_WSDL("http://2.4.6.8:8082/WS2013");                    

erhalte ich eine WebException und es funktioniert nix mehr.

Der Webservice ist über die entsprechende URL verfügbar und ich kann die WSDL über den Browser abrufen.
Kann mir jemand helfen? Komm da schon seit Tagen nicht mehr weiter und weiss nicht, wie ich es lösen kann.

Ich würde ungerne alle über manuelle HTTP-Requests absetzen müssen.

Schonmal vielen Dank im Voraus :)


DaKirsche - Do 06.06.13 11:27

Hmmm ich glaube ich habe zumindest ein Hauptproblem lokalisiert:

Die Beschreibung des Webservices unter der ersten IP sieht wie folgt aus


XML-Daten
1:
2:
3:
<definitions name="MY_WS_WSDL" targetNamespace="http://1.2.3.4:8082/WS2013">
<types>
[...]


die der anderen IP so:


XML-Daten
1:
2:
3:
<definitions name="MY_WS_WSDL" targetNamespace="http://2.4.6.8:8082/WS2013">
<types>
[...]


Kann es sein, dass es die Probleme wegen den verschiedenen Namespaces gibt? Ändere ich die Namespaces in der Proxy-Klasse funktioniert es mit der anderen IP.
Kann ich während der Laufzeit diese Daten irgendwie dynamisch einstellen oder ist es "egal" welcher Namespace verwendet wird und kann ich quasi bei beiden Webservices "http://sampleUrl.de:8085/WS2013" eintragen damit es läuft?


DaKirsche - Mo 10.06.13 10:01

So, da es wohl nicht möglich ist dynamisch den Namespace zu ändern habe ich nun den Request manuell erzeugt und kontaktiere den Webservice via URL und Namespace aus Konfigurationsdateien.