2010-07-05 13 views
19

In einer Kernbaugruppe, die sowohl in einem Windows-Dienst als auch in einer Webanwendung ausgeführt wird, muss ich Informationen pro Benutzersitzung speichern. Der Dienst hat eine einzelne Benutzersitzung und die Webanwendung verwendet HttpContext.Current.Bestimmen, ob Anwendung Webanwendung ist

Ich möchte konfigurieren, welche Methode in der Kernbaugruppe verwendet werden soll - Konvention über Konfiguration. Ich möchte dies nur einmal tun, und ich glaube, HttpContext.Current wird Null sein, wenn von Application_Start ausgeführt wird.

Wie kann ich zuverlässig feststellen, ob es sich bei der Anwendung um eine Webanwendung handelt?

Antwort

34
if(HttpRuntime.AppDomainAppId != null) 
{ 
    //is web app 
} 
else 
{ 
    //is windows app 
} 
1

Wenn möglich, würde ich vorschlagen, es als Eingabeparameter für einige Initialisierungsmethoden in der Klassenbibliothek zu haben, die aufgerufen werden müssten, bevor die Klassenbibliothek verwendet werden kann.

Wenn das keine Option ist, würde ich HttpRuntime.Cache betrachten, die ich denke, wäre nicht null, auch wenn HttpRuntime.Current null ist. Ich bin kein Webforms-Typ, aber ich erinnere mich daran, dass jemand das irgendwann für eine ähnliche Frage erwähnt hat (kann diese Frage jetzt nicht finden).

11

ich gehen würde, für

HostingEnvironment.IsHosted 

Beachten Sie, dass es einen leichten Overhead entstehen, wenn Sie eine Methode aus einer Anordnung wie diese verwenden, auch wenn Sie nicht vorhaben, es zu benutzen . (System.Web wird geladen und mehrere Klassen können initialisiert und JITed werden.) Außerdem besteht eine starke Abhängigkeit von System.Web, so dass Sie es nicht in einer eingeschränkten Framework-Einstellung verwenden können (derzeit IIRC nur mit dem Client-Profil) .

Eine andere Art und Weise (wenn auch nicht so ordentlich und dokumentiert), ist

Path.GetFileName(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile) 

zu überprüfen Wenn diese zurück web.config (oder ein Gehäuse Variante davon), dann ist es wahrscheinlich eine Web-Anwendung. (Obwohl Sie eine beliebige Anwendungsdomäne mit einer Konfigurationsdatei mit dem Namen web.config einrichten können, ist dies kein wahrscheinliches Szenario.) Dies vermeidet die Abhängigkeit von System.Web.

HostingEnvironment.IsHosted soll jedoch angeben, ob eine App-Domäne für die Ausführung unter ASP.NET konfiguriert ist.

1

In der Webanwendung Assembly.GetEntryAssembly() ist null. Ich benutze es in zwei Bibliotheken und bis jetzt funktioniert es großartig.

+0

Ich zweite diese Lösung. Testen Sie es mit Code, der in einem Webkontext über ASP.NET und in einem Windows-Dienst ausgeführt wird. –

2

Nur damit niemand sonst den gleichen Fehler macht wie ich.

Assembly.GetEntryAssembly() funktioniert nicht, um zu definieren, ob es eine Webanwendung ist oder nicht. Wenn es als Dienst ausgeführt wird, ist Assembly.GetEntryAssembly() null, aber wenn ich von VS debugge, ist es nicht null.

Verwandte Themen