2016-12-31 5 views
1

Я использовал простую службу Windows, чтобы заставить метод работать в определенное время, и он отлично работает. После этого я уже пробовал:Вызов веб-службы в службе Windows

protected override void OnStart(string[] args) 
{ 
    this.WriteToFile("Simple Service started {0}"); 
    this.ScheduleService(); 
} 

protected override void OnStop() 
{ 
    this.WriteToFile("Simple Service stopped {0}"); 
    this.Schedular.Dispose(); 
} 

private Timer Schedular; 

public void ScheduleService() 
{ 
    try 
    { 
     Schedular = new Timer(new TimerCallback(SchedularCallback)); 
     string mode = ConfigurationManager.AppSettings["Mode"].ToUpper(); 
     this.WriteToFile("Simple Service Mode: " + mode + " {0}"); 

     //Rest of the code here 
    } 
    catch(Exception ex) 
    { 
     WriteToFile("Simple Service Error on: {0} " + ex.Message + ex.StackTrace); 

     //Stop the Windows Service. 
     using (System.ServiceProcess.ServiceController serviceController = new System.ServiceProcess.ServiceController("SimpleService")) 
     { 
      serviceController.Stop(); 
     } 
    } 
} 

Это делается в простом приложении для Windows. Поэтому я пытаюсь позвонить в веб-службу (конкретный метод для работы в определенное время) в службе Windows. Приложение, которое я создаю, основано на веб-интерфейсах и немного путано, как бы интегрировать в него службу Windows? Нужны ли мне какие-либо альтернативы, или любые предложения будут оценены.

Примечание: Что я хотел бы знать, требуется ли создать другой проект для службы Windows в веб-приложении или любым другим способом реализовать?

+2

Да. Ваша служба Windows должна быть отдельным проектом. – PhillipH

+0

Спасибо за ответ, и я думал об этом @PhillipH. Кстати, знаете ли вы или у вас есть полезный учебник или ссылка на него? –

+0

См. Мой более полный ответ. – PhillipH

ответ

0

В ответ на ваш запрос на мой комментарий;

Другим подходом является использование веб-сайта IIS Auto-Start, связанного с вашей логикой службы Windows. Автозапуск IIS является более безопасным для использования службы Windows, так как содержит всю логику хостинга приложений IIS, включая автоматический перезапуск и агрессивное управление ресурсами. Плохо написанная служба Windows может удалить сервер, но для приложения ASP.NET IIS для принятия решения о его запуске (его почти невозможно) требуется много.

Ваш веб-сайт Auto-Start не должен быть видимым для внешнего мира - он просто должен иметь встроенный таймер, который поддерживает его при запуске. Обратите внимание, что веб-приложение может быть запущено и остановлено IIS по различным причинам; но результатом является то, что он будет запускаться всякий раз, когда будет запущено другое приложение веб-службы. Внутренний таймер может подождать определенное время для выполнения логики, необходимой для вызова второй веб-службы.

Главное, что нужно помнить, это то, что служба Windows предназначена для приложения, которое размещается в Windows и постоянно работает. Приложение IIS предназначено для запуска Windows, но работает только при вызове. Концепция веб-сайта IIS Auto-Start позволяет вам предоставлять «постоянно работающий» веб-сайт, но размещаться с помощью надежных компонентов хостинга приложений IIS, а не напрямую работать в ОС.

Обычно люди не делают этого, потому что либо они не знают об этом, либо хотят избежать необходимости использования инфраструктуры IIS для запуска приложений типа «Служба Windows», но в вашем случае вы уже заплатили стоимость использования IIS для размещения своих второй веб-сервис, поэтому вы можете в полной мере использовать IIS (и избегать второго стека технологий и развертывания головных болей развертывания Windows Service).

Поэтому я предлагаю использовать автоматический запуск IIS в качестве службы Windows в вашей ситуации, потому что;

  1. Вам нужно использовать только на техническом стеке в вашем решении, которое было то, что ваш О.П. спрашивал о
  2. IIS осуществляют активное управление ресурсами на всех его приложениях, завершение перезагрузки, как если бы они необходимые стать не- функциональны. У служб Windows нет такой возможности.
  3. Ваш служебный код на основе IIS является XCOPY-развертываемым без учетных данных доступа администратора на целевой машине.
  4. Ваша служба IIS доступна с возможностью обновления без необходимости соблюдения прав администратора уровня ОС - IIS обрабатывает остановку и перезапуск при обновлении без необходимости делать что-либо.
+1

Прошу прощения, но это похоже на необоснованный «IIS - это блаженство, обслуживание сосать». Позаботьтесь о том, чтобы подтвердить свои претензии доказательствами? – CodeCaster

+0

@CodeCaster - плохой день? Не совсем полезный или конструктивный комментарий; однако, чтобы более подробно объяснить мою рекомендацию, я обновил свой ответ. – PhillipH

+0

PhillipH Я должен согласиться с @CodeCaster, потому что вопрос состоял в том, как интегрировать службу Windows с (вызовом?) Веб-службы. Объяснения относительно того, почему следует перейти на веб-сайт IIS Auto-Start в сторону, у нас нет ответа на основной вопрос о том, как делать то, что ОП задал в контексте фактического использования службы Windows для вызова веб-службы, или если это невозможно/не может быть сделано - не только это IYHO, его не следует пытаться, и вместо этого следует использовать веб-сайт IIS Auto-Start, для которого здесь недостаточно информации о том, как это сделать и о том, как реализовать все шаг за шагом. – vapcguy

4

Чтобы вызвать веб-службу из приложения Windows Service, вы должны сначала создать DLL из этой веб-службы, а затем создать экземпляр своего пространства имен. Если у вас есть код для этого веб-службы и/или знать его пространство имен, вы можете выполнить следующие команды, чтобы сделать это:

  1. Выполните эти строки в командной строке:

    cd C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools
    wsdl /l:CS /protocol:SOAP %svc%?WSDL

    где %svc% является URL для веб-службы, т.е. http://localhost:777/MyWebService.asmx

    Если код в VB вместо C#, изменить /l:CS к /l:VB. Это приведет к созданию файла класса прокси, который может быть преобразован в DLL.

  2. Переместить MyWebService.cs файл с C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools в каталог C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\.

  3. Выполнить эти две команды в командной строке:
    cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
    csc /t:library %name%.cs /reference:System.Web.Services.dll /optimize

    где %name% это имя класса (без .cs, так как команда добавит это). В нашем случае мы будем использовать MyWebService. (Измените .cs на .vb для класса VB.)

  4. Перейти к C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 через Проводник. Вы должны увидеть DLL, созданную в этой папке с именем класса (MyWebService.dll). Скопируйте этот файл в папку bin вашего Сервисного проекта. Вам нужно будет установить папку bin, которая будет включена в ваш проект, и щелкните ее правой кнопкой мыши по адресу . Добавить> Существующий элемент. Выберите DLL. После импорта, выберите DLL и изменить его свойства:

    сборки Действие: Содержание
    Копировать в выходной каталог: Копировать, если новее (или Copy всегда, как вы предпочитаете)

  5. правой кнопкой мыши Ссылки> Добавить ссылки. Перейдите к DLL в папке bin для вашего веб-сервиса.

  6. Щелкните правой кнопкой мыши Ссылки> Добавить ссылки на службы. Предполагая, что ваш веб-сервис запущен, введите полный URL-адрес (т. Е. http://localhost:777/MyWebService.asmx) и поместите его в адресную строку. В текстовом поле Namespace дайте ему что-то более значимое, чем ServiceReference1, но оно не должно совпадать с MyWebService (пространство имен/имен файла ASMX). Возможно MWS.

  7. Инстанцировать ваш веб-службу в вашей службе Windows:

    MWS.MyWebServiceSoapClient webService = new MWS.MyWebServiceSoapClient();
    webService.Open();
    string someDataYouWant = webService.SomeMethodToGetData();
    webService.Close();

    Или вы, вероятно, можете сделать:

    MyWebService webService = new MyWebService();
    string someDataYouWant = webService.SomeMethodToGetData();
    webService.Dispose();

+0

Я сделал это (с той разницей, что я создал .dll из созданного автоматически .cs внутри проекта визуальной студии). Но webservice не ссылается на .dll, даже когда я импортирую его в первую очередь. Итак SoapClass1 в dll! = SoapClass1 в ServiceRef. Я не знаю, является ли это причиной InvalidOperationException при установке службы? (EndpointName не найден). Я пропустил файл/папку, которую нужно скопировать в папку установки службы (я не тестирую в папке проекта!) – FrankKrumnow

+1

Вы должны быть очень осторожны в соблюдении этих инструкций. Не пропустите ни одного шага! Вам нужно будет скопировать DLL в папку «bin» вашего проекта Visual Studio (шаг 4). Это фактическая папка Windows Explorer. Затем вы переносите его в Visual Studio, щелкнув правой кнопкой мыши папку 'bin' в вашем обозревателе решений в VS и выберите« Включить в проект ». Затем щелкните правой кнопкой мыши папку и «Добавить существующий элемент» и выберите DLL. Затем обратитесь к DLL, как и к любой обычной сборке (шаг 5), а затем добавьте ссылку на службу (шаг 6). Это самые важные шаги. – vapcguy

+1

Если вы сначала не создадите ссылку на службу, вы не сможете создать экземпляр класса. Веб-служба должна быть запущена и доступна в сети с использованием VS. Это где вы получаете ошибку или во время создания экземпляра в коде? В коде вы можете попробовать «SoapClass1 webSvc = new SoapClass1(); string myResult = webSvc.SomeMethod (someParam); webSvc.Dispose(); ' – vapcguy