Как автоматически запустить C# WebService?

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

8
задан rohancragg 24 March 2010 в 08:29
поделиться

8 ответов

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

10
ответ дан 5 December 2019 в 08:23
поделиться

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

4
ответ дан 5 December 2019 в 08:23
поделиться

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

3
ответ дан 5 December 2019 в 08:23
поделиться

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

1
ответ дан 5 December 2019 в 08:23
поделиться

Фактически, вы можете запустить поток или задание автоматически в «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
ответ дан 5 December 2019 в 08:23
поделиться

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

1
ответ дан 5 December 2019 в 08:23
поделиться

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

1
ответ дан 5 December 2019 в 08:23
поделиться

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

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

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

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

-1
ответ дан 5 December 2019 в 08:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: