Как определить, размещена ли служба WCF в IIS или что-то еще? - PullRequest
1 голос
/ 06 июня 2011

У меня есть служба WCF, которая иногда размещается в IIS, а иногда - в службе Windows.Это необходимо для разных вариантов развертывания моего приложения.Что хорошего в сервисном объекте, чтобы определить, где он находится?

Причина, по которой я хочу, заключается в том, что, когда моя служба размещается в IIS, она получает информацию о строке подключения из файла web.config обычным способом.Когда он размещается службой Windows, он получает информацию о конфигурации другим способом (из информации в реестре).В конструкторе моего сервисного объекта я хочу отметить, откуда можно получить информацию о строке подключения, например, что-то вроде этого:

public void MyServiceObject()
{
     _hostedInIis = isHostedInIis();
}
private string ConnectionString()
{ 
     if (_hostedInIis)
         return ConfigurationManager.ConnectionStrings["MyDatabase"].ConnectionString;
     else 
         return GetConnectionStringFromRegistry();
}

В качестве альтернативы, есть ли способ передать ему некоторую информацию о конфигурации, когдам хостинг внутри службы windows?например, передайте ему строку подключения или флаг, говорящий, что он размещен в службе Windows.

Ответы [ 3 ]

2 голосов
/ 06 июня 2011

Мне нужно было что-то похожее, когда я настраивал сервис для запуска либо автономно с config, либо под IIS без файла конфигурации вообще.В итоге я использовал пользовательский ServiceHostFactory для случая IIS.После того, как фабрика создаст ServiceHost, она добавляет пользовательский объект конфигурации в свое свойство Extensions с информацией, которую я не смог поместить в web.config.Примерно так:

protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
  var host = base.CreateServiceHost(serviceType, baseAddresses);
  host.Extensions.Add(new CustomConfigurer());
  return host;
}

Затем в файле .svc для службы вы можете указать пользовательскую фабрику, а IIS просто будет использовать ее:

<%@ ServiceHost Service="..." Factory="..." %>

Когда ваша служба работаетвызывается, он может искать объект конфигурации на расширениях хоста:

public int Add(int x, int y)
{
  var config = OperationContext.Current.Host.Extensions.Find<CustomConfigurer>();
  if (config == null)
  {
    // Load elsewhere
  }
}
1 голос
/ 07 июня 2011

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

0 голосов
/ 06 июня 2011

, вероятно, не лучший способ, но вы можете проверить HttpContext, который обычно присутствует в приложении Asp.net

 private string ConnectionString()
        {
            if (HttpContext.Current!=null)
                return ConfigurationManager.ConnectionStrings["MyDatabase"].ConnectionString;
            else
                return GetConnectionStringFromRegistry();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...