2013-12-18 103 views
10

我們目前正在將應用程序的某些實例移動到Azure,但仍將保持與Azure託管的現有實例的向後兼容性。檢測.NET應用程序是在Azure還是在非Azure環境中運行

如果不在非Azure生產服務器上安裝SDK,是否有檢測環境的好方法?

我已經嘗試使用:

if (RoleEnvironment.IsAvailable) 

從Microsoft.WindowsAzure.ServiceRuntime,和它完美的作品在本地,並且在Azure上。不過,我需要的Microsoft.WindowsAzure.ServiceRuntime.dll設置爲CopyLocal,甚至然後我得到:

無法加載文件或程序集「msshrtmi,版本= 2.2.0.0,文化=中立,公鑰= 31bf3856ad364e35'或其依賴關係之一

似乎沒有NuGet軟件包,我也不想手動複製msshrtmi dll。

也許有一種檢測方式沒有依賴Microsoft.WindowsAzure.ServiceRuntime?

回答

5

不幸的是解決這個最簡單的方法是將msshrtmi.dll文件複製從:

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

我知道這是不是很漂亮複製的DLL左右,但是這是你唯一需要的一個以防止錯誤,並將其與您正在使用的SDK版本綁定,因此在更新SDK之前不會更改。

一個可行的方法是在構建Azure應用程序時在appSettings中添加配置值並應用config transform

+1

由於格雷格 - 我最終使用配置變換來創建一個開關。如果有一種方法可以自動檢測,本來會很好,但沒關係。再次感謝您的全面迴應! –

0

您可以嘗試在msshrtmi, Version=2.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35程序集上調用Assembly.Load,如果失敗,則不要嘗試調用RoleEnvironment.IsAvailable方法(因爲您知道您絕對不在Azure上運行)。

另外,您可以嘗試使用計算機名,因爲所有Azure的實例開始與「RD」

+1

非天藍色的實例也可能在名稱以「RD」開頭的機器上運行。 – Gusdor

+0

另外 - 如果我在我的模擬器中運行它,機器名稱不會以RD開頭。我不想查找那些不存在的文件,所以我只用了config switch選項。 –

2

您可以驗證,如果RoleRoot環境變量存在。如果是這樣,您的應用程序將以Web或Worker角色運行。

2

您可以檢查使用if(RoleEnvironment.IsEmulated)

相關問題