Как автоматически запустить C # WebService? - PullRequest
8 голосов
/ 24 марта 2010

Я написал C # WebService. Проблема в том, что после того, как я опубликую его в IIS, он не запустится автоматически, если не будет вызван какой-либо из его методов. Это очень расстраивает, потому что этот WebService должен непрерывно выполнять некоторую фоновую работу сразу после запуска (его конструктор выполняется). Если IIS перезапустится, WebService будет просто сидеть без дела, пока не будет вызван один из его методов. Есть ли способ преодолеть это и заставить WebService выполнять свой конструктор сразу после публикации или перезапуска IIS?

Ответы [ 9 ]

10 голосов
/ 24 марта 2010

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

4 голосов
/ 24 марта 2010

Если вам нужно, чтобы он работал постоянно, ваш дизайн имеет недостатки. Вместо этого создайте службу Windows.

3 голосов
/ 24 марта 2010

Я не думаю, что веб-сервис предназначен для непрерывной работы в фоновом режиме - он предназначен для обслуживания запросов на его методы.

1 голос
/ 24 марта 2010

На самом деле вы можете автоматически запускать поток или задание в «Global.asax.cs». Например.

 public System.Threading.Thread schedulerThread = null;
 protected void Application_Start(Object sender, EventArgs e)
  {
    schedulerThread = new System.Threading.Thread(YourLoopBackgroudMethodHere);
    schedulerThread.Start();
  }
И не забудьте закрыть ветку, когда закончится приложение вашего сайта.
protected void Application_End(Object sender, EventArgs e)
  {
    if (null != schedulerThread)
    {
      schedulerThread.Abort();
    }
  }
1 голос
/ 24 марта 2010

Я согласен с другими, вы должны использовать службу Windows. Если вы используете WCF, вы можете легко разместить свой веб-сервис внутри службы Windows и получить лучшее из обоих миров. См. статью MSDN для учебника.

1 голос
/ 24 марта 2010

Помимо (правильного) замечания, что вы должны использовать службу Windows для вещей, которые должны работать в фоновом режиме: вы можете использовать событие Application_Start в global.asax?

1 голос
/ 24 марта 2010

Вам необходимо создать службу Windows. Здесь - шаги по созданию службы Windows для запланированной задачи.

0 голосов
/ 30 декабря 2013

IIS 7.5 поддерживает это требование с помощью расширения, модуля инициализации приложения для IIS 7.5, http://www.iis.net/downloads/microsoft/application-initialization.

IIS 8.0 имеет встроенную поддержку: http://www.iis.net/learn/get-started/whats-new-in-iis-8/iis-80-application-initialization.

0 голосов
/ 24 марта 2010

И я не согласен. Есть веские причины убедиться, что веб-служба запускается с компьютера - чтобы он мог начинать заполнять свои кэши и / или просто избегать медленного первого выполнения.

Команда IIS со мной в этом. Вот почему они разработали что-то для этого:

http://www.iis.net/expand/ApplicationWarmUp

Этот модуль может убедиться, что веб-сайт "теплый" (как в: запущен) при запуске IIS.

...