2013-12-18 8 views
10

Wir verschieben derzeit einige Instanzen unserer Anwendung in Azure, behalten jedoch weiterhin die Abwärtskompatibilität mit vorhandenen Instanzen, die nicht von Azure gehostet werden.Erkennen, ob eine .NET-App in Azure oder in einer Nicht-Azure-Umgebung ausgeführt wird

Gibt es eine gute Möglichkeit, die Umgebung zu erkennen, ohne das SDK auf dem Nicht-Azure-Produktionsserver zu installieren?

Ich habe versucht, mit:

if (RoleEnvironment.IsAvailable) 

von Microsoft.WindowsAzure.ServiceRuntime, und es funktioniert perfekt lokal und in Azure. Allerdings muss ich die Microsoft.WindowsAzure.ServiceRuntime.dll zu Copylocal setzen, und selbst dann erhalte ich:

konnte nicht geladen werden Datei oder Assembly ‚msshrtmi, Version = 2.2.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35' oder eine ihrer Abhängigkeiten

Es scheint nicht ein NuGet Paket zu sein, und ich will nicht manuell über die msshrtmi dLL kopieren.

Vielleicht gibt es eine Möglichkeit der Erkennung ohne die Abhängigkeit von Microsoft.WindowsAzure.ServiceRuntime?

Antwort

5

Leider ist der einfachste Weg, dies zu lösen, ist die msshrtmi.dll Datei aus kopieren:

C:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\{version}\bin\runtimes\base\x64

Ich weiß, es ist nicht sehr schön Kopieren DLLs um, aber dies ist die einzige, die Sie brauchen, um den Fehler zu vermeiden, und seine mit der SDK-Version, die Sie verwenden, gebunden sind, so ändert sich nicht, bis Sie das SDK aktualisieren.

Eine praktikable Alternative wäre, einen Konfigurationswert in appSettings hinzuzufügen und eine config transform anzuwenden, wenn Sie die Anwendung für Azure erstellen.

+1

Dank Greg mit - ich am Ende eines Config-Transformation up mit einem Schalter zu schaffen. Wäre schön gewesen, wenn es einen Weg zur automatischen Erkennung gäbe, aber egal. Nochmals vielen Dank für eine umfassende Antwort! –

0

Sie könnten versuchen Assembly.Load auf der msshrtmi, Version=2.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 Assembly aufrufen, und wenn es fehlschlägt, dann versuchen Sie nicht und rufen Sie die RoleEnvironment.IsAvailable-Methode (wie Sie wissen, dass Sie definitiv nicht auf Azure ausgeführt werden).

Alternativ können Sie versuchen, den Computernamen verwenden, da alle Azure-Instanzen mit „RD“ beginnen

+1

Eine Nicht-Azure-Instanz kann auch auf einem Computer ausgeführt werden, auf dem der Name mit "RD" beginnt. – Gusdor

+0

Auch - wenn ich es in meinem Emulator ausführen würde, würde der Computername nicht mit RD beginnen. Ich möchte nicht nach Dateien suchen, die auch nicht existieren, also bin ich mit der Option config switch gegangen. –

2

Sie können überprüfen, ob der RoleRoot Umgebungsvariable vorhanden ist. Wenn dies der Fall ist, wird Ihre Anwendung in einer Web- oder Worker-Rolle ausgeführt.

2

können Sie überprüfen if(RoleEnvironment.IsEmulated)