Ich habe einen Bibliothekscode, der wissen sollte, ob er im Kontext eines Webservers oder eines eigenständigen Anwendungsservers ausgeführt wird.
Es ist offensichtlich, dass Sie den Namen der Anwendungskonfigurationsdatei überprüfen müssen und ob es web.config ist - dann ist dies ein Webserver, ansonsten - ein eigenständiger Anwendungsserver.
Eine andere Möglichkeit ist, nach etwas wie "Temporäre ASP.NET-Dateien" im Pfad des Schattenordners zu suchen.
Aber ich mag beide nicht, da sie zu hackig und zerbrechlich wirken. Gibt es einen robusten Weg, um das zu tun, was ich will?
Danke.
P.S.
Man kann eine dedizierte App-Konfigurationseinstellung definieren - IsWebServer, aber ich mag es sogar noch mehr.
BEARBEITEN:
Bei der Suche nach einer Lösung für ein anderes Problem, denke ich, habe ich das gelöst - die Details sind hier
Um ein anderes Problem zu lösen, habe ich eine gute Lösung für dieses Problem gefunden.
Es gibt eine private Methode System.Configuration.SettingsPropertyValue.IsHostedInAspnet
, die genau das tut, was ich brauche. Da ich eine private Methode bin, möchte ich sie nicht nennen (obwohl ich Reflexion verwenden könnte), aber ihre Implementierung ist trivial:
(gemäß Reflektor)
Sieht so aus, als gäbe es einen speziellen Schlüssel in den Daten der App-Domäne - ".appDomain", der beim Ausführen auf dem ASP.NET-Webserver festgelegt wird.
Ich bleibe dabei.
Die beste Option ist eine Konfigurationseinstellung.
Es ist besser für die Testbarkeit; es ist besser, weil es eine offensichtliche Aussage darüber ist, wie der Code funktioniert, und es ist besser, weil es nicht auf Implementierungsdetails beruht; Sie verzweigen gezielt von einem Wert, den Sie festgelegt haben. Es kann sein, dass die Entscheidung, die Sie treffen, nicht offensichtlich ist und Ihre Variable / Config die Schlussfolgerung nahelegen kann.
Es ist die Option, die ich wählen würde.
Sie können den aktuellen Prozessnamen herausfinden:
%Vor%und prüfen Sie, ob dies der ASP.NET-Prozessname ist
Ruft einen Wert ab, der angibt, ob die aktuelle Windows-Präsentation Foundation (WPF) -Anwendung ist Browser gehostet.
So ist es in XBAP gemacht
oder wenn Sie eine appdomain haben, tun Sie Reflektion und bekommen Sie etwas davon? Verwenden Sie
Ich denke, das Beste ist, die Bibliothek in zwei DLLs aufzuteilen, eine, die wirklich generisch ist, und eine (die ASP.NET benötigt), die nur auf der Website geladen wird. Überprüfen, ob es derzeit in ASP.NET läuft, fühlt sich an wie ein bisschen wie ein Hack.
Natürlich hängt es von der Situation ab, ob du das leicht machen kannst oder nicht.
Siehe die Antwort, die ich hier zur Verfügung gestellt habe ...
Grundsätzlich können Sie HostingEnvironment verwenden .IsHosted .