2013-05-28 140 views
6

我有一個接口,我們稱之爲ILocateLogFile,具有開發/測試/生產服務器的標準實現,並且只能在本地開發環境中使用。如果我在本地運行或在服務器上運行,我似乎無法想出一個很好的乾淨方式來決定(最好在編譯時,但運行時會很好)。這是一個託管在IIS上的WCF應用程序,如果這很重要的話。如何判斷代碼是否從Visual Studio/Cassini本地運行

我想出是使用編譯器符號最好的,是這樣的:

ILocateLogFile locateLogFile; 
#if DEBUG 
    locateLogFile = new DevSandboxLogFileLocator(); 
#else 
    locateLogFile = new LogFileLocator(); 
#endif 

的問題是,編譯符號得到由構建,這是我無法控制設置,和我想要確定。是不是有一些自動的方式來檢查Visual Studio的存在?或者至少檢查卡西尼,而不是IIS?

+0

我已經看到了這個由一個if else語句作爲服務器名變量檢查之前解決的代碼。 – RandomUs1r

+1

任何不使用.config文件來配置日誌記錄的原因? (可能您已經爲每個環境使用不同的.config,因此也可能無足輕重地添加日誌記錄)。 –

+0

@ RandomUs1r這是一個很好的建議,但我不能使用'System.Web.HttpContext'因爲我的WCF服務沒有使用ASP.Net兼容性... – McGarnagle

回答

8

兩個方法我已經這樣做了1,你可以檢查進程名

bool isRunningInIisExpress = Process.GetCurrentProcess() 
           .ProcessName.ToLower().Contains("iisexpress"); 

或者用自定義設置

<appSettings> 
    <add key="ApplicationEnvironment" value="LOCAL_DEV" /> 
</appSettings> 

更新你的配置文件,您爲每個環境專門更新,並有你應用程序查詢

我不知道是否有一種方法可以在編譯時確定這一點,除了每個環境都有一個特殊的構建配置ronment併爲這些版本添加自定義PRAGMA。就我個人而言,我認爲這不是優雅,但它也可以工作。

+0

謝謝,我認爲第一個選項正是我正在尋找的 - 儘管我的進程名稱似乎是「WebDev.WebServer40」而不是「iisexpress」。 – McGarnagle

+0

如果您在開發服務器中使用構建,那麼這很有意義。您可能想考慮切換到IIS Express。我發現它更強大,並且內置到VS 2012/2010 SP1中。 – jstromwick

-2

下面是我用

If Debugger.IsAttached Then 
' Since there is a debugger attached, 
' assume we are running from the IDE 
Else 
' Assume we aren't running from the IDE 
End If 
相關問題