2015-12-08 2 views
2

Заполните пустые:Как проверить, если контекст является службы Windows или консольного приложения

Если кусок кода на DLL используется в различных контекстах, и мы должны определить, какой контекст мы бежим дальше, мы должны использовать:

Web Application ->System.Web.HttpContext.Current != null

WCF веб-службы ->System.ServiceModel.Operationcontext.Current != null

Windows Service || ConsoleApp ->______________________________________________________

Кроме того, если вы знаете лучший вариант для проверки одного из первых двух, сообщите нам пожалуйста.

О том, что это может быть дубликат от another question: мне не нужно различать службу Windows и консольное приложение (интерактивный пользователь или нет).

EDIT: Зачем мне это нужно?

Мне нужно открыть файл конфигурации для запущенного приложения из библиотеки, которая может работать в разных контекстах. Это то, что я в настоящее время:

Configuration appConfig = null; 

if (System.Web.HttpContext.Current != null || System.ServiceModel.OperationContext.Current != null) 
{ 
    // The call was originated from a web application or from a WCF web service. 
    appConfig = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~"); 
} 
else 
{ 
    // The call may have been originated from a console application or a windows service. 
    // THE ANSWER TO MY SO QUESTION WOULD ALLOW ME TO INSERT AN IF HERE!! 
    appConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
} 

части иначе предполагая, я бегу на ехе, как окружающая среда (Windows Service, консоль приложения). Я хотел бы включить if, чтобы быть уверенным, что OpenExeConfiguration не будет генерировать исключение.

Я уже рассматривал использование блоков try, но это не подходит для моего дела.

+0

@ user2893289 Я отредактировал свой вопрос, чтобы указать, почему это не дубликат. – daniloquio

+0

, возможно, вам стоит объяснить, почему вы должны это знать. –

+0

Практически всегда лучше выставлять точки расширения, чтобы ваш потребитель мог подключаться и выбирать наиболее подходящее поведение, а не вашу DLL «магически», решающую лучший способ сделать что-то. –

ответ

2

Я думаю, что это довольно хрупкая конструкция, но если проверить, является ли AppDomain.CurrentDomain.SetupInformation.ConfigurationFile Концы в строке web.config вы можете проверить, что текущий домен приложения работает в веб-сервере, так, то вы можете позвонить System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~"); получить Configuration экземпляр ,

Обратное также верно: если оно заканчивается на .exe.config, вы можете использовать ConfigurationManager.OpenExeConfiguration(...).

+0

Мне нравится этот подход, потому что он действительно работает, но вы представляете ответ с точки зрения того, как определить, что вам нужно открыть web.config, тогда как вопрос заключается в том, как определить, что вам нужно использовать OpenExeConfiguration, потому что мы в контексте exe. Таким образом, можно проверить, заканчивается ли 'AppDomain.CurrentDomain.SetupInformation.ConfigurationFile' с .exe.config. Вы согласны? – daniloquio

+0

И да, я согласен, что это хрупкий, не идеальный, но иногда у вас нет альтернативы. – daniloquio

Смежные вопросы