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
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. –
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. –