2009-02-25 3 views
0

In einem .Net-Webdienst kann festgestellt werden, ob die Assembly in einen Webdienst geladen wurde. Wenn ja, wie würde eine solche Überprüfung erfolgen? Und aus einer solchen Prüfung kann der ursprüngliche Standort der Baugruppe ermittelt werden?Kann festgestellt werden, ob die Baugruppe in einen Webdienst geladen wurde?

Es ist eine lange Geschichte, in der Assemblies zwischen mehreren Eingangspunkten unserer Anwendung auf einem Server geteilt werden, von denen einige über Webdienste zugänglich gemacht werden und andere über traditionellere TCP-Sockets, die in normalen Windows-Diensten gehostet werden. Möglicherweise werden auch andere Windows-Dienste mit denselben freigegebenen Assemblys ausgeführt. Die Konfigurationsanforderungen von jedem sind leicht unterschiedlich und Aufrufe wie System.Windows.Forms.Application.ExecutablePath führen zu unterschiedlichen Ergebnissen, je nachdem, was die Assembly "hostet". Ich muss in der Lage sein, den Standort der Baugruppe zuverlässig zu berechnen, um den Speicherort der Konfigurationsdatei zu berechnen.

Web.config/app.config sind keine Optionen in diesem Szenario.

Es wäre möglich, einen Eintrag in die Registrierung zu setzen, der verwendet werden könnte, um festzustellen, wo sich die Anwendung (en) und alle Baugruppen befinden. Dies wäre jedoch nicht so wünschenswert, als wenn die Anwendung (en) die Standorte selbst berechnen würde.

EDIT:

Lassen Sie uns, dass foo.dll von beiden MyApp.asmx (die Web-Service) und MyService.exe (der Windows-Dienst) aufgerufen werden kann. Gibt es trotzdem festzustellen, ob MyApp.asmx die Anwendung war, die foo.dll aus dem Code-Behind (MyApp.dll) geladen hat?

Antwort

1

Das wird die alle Baugruppen erhalten den aktuellen Ausführungskontext geladen:

Assembly[] loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); 
+0

Dadurch wird die vollständige Liste der Assemblys abgerufen, die primäre Frage wird jedoch nicht behandelt: So ermitteln Sie, ob die Assembly in einem Webdienst ausgeführt wird. –

+0

Wenn Sie "innerhalb eines Webdienstes" sagen, meinen Sie, dass die Überprüfung über den Code in Ihrem Webdienst erfolgt oder wenn Sie außerhalb des Webdienstes sind und diesen Service fragen möchten, wenn er eine bestimmte Assembly geladen hat? –

+0

Aus Code, der im Web-Service ausgeführt wird. Es kann eine zusätzliche Assembly sein, die der Webdienst geladen hat. –

-1

Sie einen Anruf tätigen könnte:

Assembly.GetExecutingAssembly().CodeBase 

In Ihrem Code, dies würde Ihnen sagen, wo zur Zeit der Ausführung Montage lebt.

+0

Ja, aber es wird mir nicht sagen, wie ich feststellen kann, ob die Assembly von einem Webservice aus ausgeführt wird ... was ich wirklich wissen möchte. –

0

Wenn Sie den Code besitzen, wäre es besser, eine Initialisierung Methode oder Eigenschaft von einer Art hinzuzufügen, die durch den Aufruf von Code verwendet werden könnte sagen die Montage, wo es läuft. In der Tat könnten Sie eine statische Eigenschaft hinzufügen, die der Speicherort der Konfigurationsdatei ist.

Dies würde Ihnen auch in anderen Szenarien helfen, z. B. während der Tests, bei denen Sie explizit angeben sollten, welche Konfigurationsdatei verwendet werden soll, anstatt die Logik einzubetten, welche Konfigurationsdatei zu verwenden ist.

+0

Eine statische Eigenschaft könnte funktionieren. Es gibt jedoch keine Garantie, dass die Anwendung bei jedem Kunden an demselben Ort platziert wird. –

0

In einen weiteren Aspekt der Web-Service-Forschung, stieß ich auf diese:

string path = Context.Request.ServerVariables["APPL_PHYSICAL_PATH"]; 

Das ist etwas wie zurückkehren wird "C: \ inetpub \ wwwroot \ MyWebApp \", das anzeigt, ob die Anwendung installiert ist. Der spezifische Pfad hängt davon ab, wo die Anwendung installiert ist.

Wie in der Frage erwähnt, wird dies foo.dll nicht direkt helfen herauszufinden, ob es von einem Webdienst aufgerufen wurde oder nicht, da foo.dll normalerweise keinen Zugriff auf Context.Request hätte. Mit ein paar Änderungen an foo.dll würde es dem Webservice erlauben, foo.dll mitzuteilen, was der Anwendungsstamm war.