2012-05-31 5 views
27

Я не уверен, что это возможно, но я хочу, чтобы функция запускалась, как только служба WCF запускается для генерации исходных данных кеша. Теперь я не беспокоюсь о том, как реализовать кеш, мой вопрос заключается в том, что функция запускается при запуске службы. Служба будет RESTful.Запуск функции при запуске WCF

служба в конечном итоге будет размещен в IIS и использует .Net Framework 4.5

ответ

29

Что предлагал @KirkWoll, но только если вы находитесь в IIS, и это единственный статический метод AppInitialize в App_Code. Если вы хотите сделать инициализацию на основе за услуги, если у вас есть другой метод AppInitialize или если вы не под IIS, у вас есть эти другие варианты:

  • При использовании .NET Framework 4.5, и под IIS: вы можете использовать метод настройки службы, который будет вызываться при запуске службы. Дополнительная информация: http://msdn.microsoft.com/en-us/library/hh205277(v=vs.110).aspx.
  • Если вы себя-хостинг вашего сервиса, вы контролируете при запуске службы (вызов ServiceHost.Open(), так что вы можете инициализировать его там
  • Если вы под IIS, а не на 4.5, вы можете использовать обслуживание хозяин завода и хозяин таможенной службы будет называться, когда открывается хозяин службы. в этот момент вы можете сделать инициализацию. вы можете узнать больше о хозяевах заводах услуг в http://blogs.msdn.com/b/carlosfigueira/archive/2011/06/14/wcf-extensibility-servicehostfactory.aspx.

пример обычая приведено ниже:

public class MyFactory : ServiceHostFactory 
{ 
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    { 
     ServiceHost host = base.CreateServiceHost(serviceType, baseAddresses); 
     host.Opening += new EventHandler(host_Opening); 
     return host; 
    } 

    void host_Opening(object sender, EventArgs e) 
    { 
     // do initialization here 
    } 
} 

}

+0

Для чего это ни стоило, ни один из этих вариантов не работал для меня - мне пришлось использовать 'AppInitialize', потому что я обрабатывал файлы' .svc', которые были автоматически сгенерированы. Но это в стороне, хороший тщательный ответ. –

+0

И я испытал один странный побочный эффект, используя метод настройки службы IIS/4.5: внутри «Configure» мне пришлось добавить строку ниже, потому что она больше не читала мою сеть.настройки файла конфигурации и все пошло haywire: 'config.LoadFromConfiguration()' – user2403744

+0

@ user240374 Очень полезная информация! Чтение страницы MSDN, которая была связана в основном ответе, кажется, что точка IIS/4.5 «настройка конфигурации службы» позволяет вам настроить службу в коде, а не в файле web.config. Поэтому я предполагаю, что имеет смысл, что если у вас есть один из этих методов Configure, IIS будет игнорировать web.config, если вы явно не скажете, чтобы он прочитал его. – bmode

26

Самый простой способ создать App_Code папку под корневой WCF проекта, создать класс (я буду называть его Initializer но . не имеет значения важной частью является название метода) следующим образом:

public class Initializer 
{ 
    public static void AppInitialize() 
    { 
     // This will get called on startup 
    } 
} 

Более подробную информацию о AppInitialize можно найти here.

+0

Это может быть именно то, что я ищу. Имеет ли значение, если служба размещена в IIS? – SmashCode

+4

Да, на самом деле это требует IIS. –

+1

Я нашел, что это плохой вариант. Модуль, содержащий «AppInitialize», не скомпилирован с проектом, а представлен как «контент» и скомпилирован динамически при загрузке службы. В результате многие библиотеки, необходимые для правильного внедрения IOC, недоступны (например, System.Reflection). Хотя я согласен с необходимостью одного метода инициализации, это решение ОЧЕНЬ ограничено тем фактом, что он динамически компилируется. –

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