2010-12-28 21 views
2

Ich habe eine Situation, in der ich mehrere Web-Services habe, die ich konsumieren muss. Ich brauche die Möglichkeit, benutzerdefinierte Aktionen im Konstruktor des Proxys auszuführen, bevor irgendwelche Aufrufe getätigt werden (die konfigurierte URL zuweisen, den SOAP-Header zuweisen usw.).Verhindern der Verwendung des Standardkonstruktors auf dem generierten Web-Service-Proxy

Meine erste Lösung besteht darin, eine untergeordnete Klasse zu erstellen, die vom generierten Proxy abgeleitet wird, und diese Aktionen dann im Konstruktor der untergeordneten Klasse auszuführen. Auf diese Weise kann der App-Code den Konstruktor des Kinds aufrufen und einen gültigen Proxy mit den benötigten Daten abrufen.

Ich versuche zu verhindern, dass der App-Code den Konstruktor des generierten Proxys aufruft, damit die Leute nicht versehentlich den Proxy instanziieren, ohne meine eigenen Sachen zu machen. Mein erster Gedanke ist, den generierten Code in eine separate Assembly des untergeordneten Elements zu verschieben und sicherzustellen, dass der App-Code nur einen Verweis auf die untergeordnete Assembly enthält. Dies funktioniert zum größten Teil, aber ...

Die Dienste enthalten komplexe Typen, die im Proxy definiert sind. Ich benötige den App-Code, um auf diese Klassen zu verweisen, was bedeutet, dass der App-Code ohnehin einen Verweis auf die Basis-Assembly benötigt, was bedeutet, dass sie nun Zugriff auf den generierten Konstruktor haben.

Ich habe eine übermäßig komplexe Lösung versucht, jeden der generierten komplexen Typen in einer Schnittstelle zu verpacken und dann die echten Aufrufe zu verbergen und sie durch Kopien des Objekts als Schnittstellentyp zu ersetzen. Das hat ein- oder zweimal funktioniert, aber es wird sehr schnell hässlich.

Es scheint, dass die einzige Möglichkeit, die ich alles haben kann, den öffentlichen Konstruktor des generierten Proxy entfernen und durch einen geschützten Konstruktor ersetzen, dann einen Verweis auf diese Assembly zulassen - sie können arbeiten mit den komplexen Typen, aber wird nicht in der Lage sein, den Konstruktor aufzurufen. Mein Problem ist, dass die einzige Möglichkeit, die ich mir vorstellen kann, ist, den generierten Code zu manipulieren, um den Konstruktor zu ändern.

Irgendwelche Ideen? Ich verwende WSDL.exe, um die Proxies zu generieren, und es gibt keine Option, um den Konstruktor zu verbergen. Gibt es einen anderen Weg, den ich gerade vermisse? Ich denke, ich kann ein Werkzeug schreiben, um den Proxy sofort nach seiner Erzeugung automatisch zu ändern, aber das fühlt sich einfach hässlich an.

Danke

Antwort

0

Ich endete damit, den Proxy-generierten Code zu modifizieren, um den Konstruktor statt öffentlich zu schützen. Der Aufruf von WSDL.exe wurde bereits in einem automatisierten Projekt durchgeführt, also war es nicht so schlimm. Das war wirklich der einzige Weg, wie ich alles bekommen konnte, was ich wollte.

2

Sind Sie mit .NET 2.0 stecken? Wenn nicht, sollten Sie WSDL.EXE nicht verwenden. Sie sollten SVCUTIL.EXE oder "Add Service Reference" verwenden.

Anstatt eine abgeleitete Klasse zu erstellen, sollten Sie eigene Wrapper-Klassen erstellen, die die Proxy-Klassen verwenden. Man würde etwas wie MyWrapper.CreateProxy() verwenden, das eine ordnungsgemäß konfigurierte Instanz der Proxy-Klasse zurückgeben würde.

BTW, WSDL.EXE erstellt Proxys mit der Legacy- "ASMX" -Technologie, die nicht in der Lage ist, die Typen aus dem Dienst zu verwenden.

+0

Danke - Ich aktualisiere tatsächlich von .NET 1.1 zu .NET 4.0 - es ist bereits eine riesige Konfiguration für die Dienste eingerichtet.Mit Blick auf SVUCUTIL, glaube ich, würde es erhebliche Konfigurationsänderungen erfordern, die wir im Moment nicht machen können. –

+0

Außerdem scheint die generierte Klasse das SoapHeader-Objekt an jede Dienstmethode übergeben zu müssen. Wenn also mein Wrapper den Proxy selbst zurückgegeben hat, müsste der App-Code dieses SoapHeader-Objekt jedes Mal erstellen, was eines der Dinge ist, die ich versuche ich zu vermeiden. –

-1

Warum können Sie die GetWebRequest-Methode nicht überschreiben? Es wird vor dem Aufruf der Service-Methode trotzdem aufgerufen.

Wenn Sie eine Servicereferenz hinzugefügt haben, wird die Implementierung des Nachrichteninspektors dasselbe tun.

+0

-1: das wird ihm mit seinen SOAP-Kopfzeilen nicht helfen. –

+0

Aah ... wurde mit HTTP-Headern verwirrt. : Dah: – danish