2013-05-28 2 views
6

У меня есть интерфейс, назовем его ILocateLogFile со стандартной реализацией для dev/beta/production серверов, и тот, который работает только в локальной среде разработки. Кажется, я не думаю о хорошем чистом способе решения (желательно во время компиляции, но время выполнения будет прекрасным), если я запускаю локально или на сервере. Это приложение WCF, размещенное на IIS, если это имеет значение.Как узнать, работает ли код локально из Visual Studio/Cassini

Лучшее, что я придумал, чтобы использовать символ компилятора, что-то вроде:

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

Проблема заключается в том, компилировать символы приготовьтесь построителем, что я не в силах контролировать, и я хочу быть уверенным. Не существует ли какой-либо автоматизированный способ проверки наличия Visual Studio? Или, по крайней мере, проверить Cassini, а не IIS?

+0

Я видел это прежде, чем решить путем проверки переменного имени сервера в другом, если заявлении. – RandomUs1r

+1

Любые причины не использовать файлы .config для настройки ведения журнала? (вероятно, у вас уже есть разные .config для каждой среды, поэтому для добавления журнала также может быть тривиально). –

+0

@ RandomUs1r, это хорошее предложение, но я не могу использовать 'System.Web.HttpContext', потому что моя служба WCF не использует совместимость ASP.Net ... – McGarnagle

ответ

8

Два способа, которые я сделал это-вы можете проверить имя процесса

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

Или обновить конфигурационный файл с пользовательской настройкой

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

обновить специально для каждой среды и у вас запрос приложения для

Я не уверен, есть ли способ определить это во время компиляции, кроме того, что у вас есть специальная конфигурация сборки для каждого envi 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 
Смежные вопросы