Ten artykuł pochodzi z serii przygotowań do egzaminu 70-503: Windows Communication Foundation.
Zakładamy, że mamy już utworzony nasz serwis. Teraz nadeszła pora na wdrożenie (ang. deployment). Jedną z najprostszych metod uruchomienia serwisu jest wykorzystanie serwera IIS (Internet Information Services) lub WAS (Windows Process Activation Service). Bardzo prosty kod, który pozwala hostować naszą usługę z poziomu zarządzanej aplikacji został przedstawiony w artykule 70-503: Service Endpoint Basics, akapit Opis za pomocą kodu.
WAS
WAS, który jest komponentem IIS 7.0, pozwala komunikować się z serwisem za pomocą różnych protokołów - nie tylko HTTP. Przykładowe protokoły to: TCP, nazwane potoki (ang. named pipes), MSMQ (Microsoft Message Queuing).
Instalacja
Jeżeli WAS nie jest zainstalowany wykonujemy poniżesz kroki:
- Przechodzimy do Panelu Sterowania, Programy i funkcje, Włącz lub wyłącz funkcje systemu Windows,
-
Instalujemy wymagane komponenty:
Zaletą WAS jest to, że nie wymaga on pełnej instalacji IIS.
- Klikamy OK i “Czekamy, aż system Windows wprowadzi zmiany do funkcji. Może to potrwać kilka minut.”,
- Uruchamiamy Services.msc (z menu Start, lub Win+R), sprawdzamy, czy uruchomione są usługi: Net.Tcp Listener Adapter, Net.Tcp Port Sharing Service, Usługa aktywacji procesów systemu Windows.
Hostujemy binarki!
Uruchomimy najprostszą usługę – wygenerowaną automatycznie przez Visual Studio. Tworzymy nowy projekt typu WCF Service Library, o nazwie WAS.Hello. Budujemy projekt (Ctrl+Shift+B).
- W katalogu inetpub (zwykle c:/inetpub), w podkatalogu wwwroot tworzymy nowy katalog – HelloBin. W nim tworzymy katalog bin, do którego wrzucamy plik dll utworzony podczas budowania naszego serwisu – WAS.Hello.dll.
- W HelloBin tworzymy plik Service.svc:
1: <% @ServiceHost Language="C#" Debug="true" Service="WAS.Hello.Service1" %>
- Tworzymy plik web.config, który wypełniamy tą samą treścią, którą posiada plik App.config utworzony automatycznie w naszym projekcie w VS.
Teraz tworzymy aplikację hostującą nasz serwis:
- Uruchamiamy Menedżer internetowych usług informacyjnych (ISS) – InetMgr (Win+R),
- Klikamy prawym przyciskiem myszy na Default Web Site, wybieramy Dodaj aplikację…
- Jaki alias wpisujemy HelloBin, ścieżka - C:\inetpub\wwwroot\HelloBin. Klikamy OK.
- Możemy już odpalić nasz serwis pod adresem http://localhost/HelloBin/Service.svc!
Gdybyśmy chcieli komunikować się z serwisem także przez TCP, możemy wywołać dwa polecenia:
- %windir%\system32\inetsrv\appcmd.exe set site "Default Web Site"
-+bindings.[protocol='net.tcp',bindingInformation='808:*']
- %windir%\system32\inetsrv\appcmd.exe set app
"Default Web Site/TaskManagerHost" /enabledProtocols:http,net.tcp
Alternatywnie możemy to samo wyklikać z poziomu Menedżera IIS:
- Klikamy prawym przyciskiem myszy na Default Web Site, Edytuj powiązania…, Dodaj…
Klikamy OK, Zamknij.
- Klikamy prawym przyciskiem myszy na HelloBin, Zarządzaj aplikacją…, Ustawienia zaawansowane…
Edytujemy włączone protokoły, klikamy OK.
Hostujemy kod
- W C:\inetpub\wwwroot tworzymy katalog HelloCode. W katalogu tym dodajemy kolejny – App_Code, do którego dodajemy pliki Service1.cs oraz IService1.cs.
- Tworzymy plik Service.svc w HelloCode:
1: <%@ ServiceHost Language="C#" Debug="true" Service="WAS.Hello.Service1" CodeBehind="~/App_Code/Service.cs" %>
- Tworzymy plik Web.config:
1: <?xml version="1.0" encoding="utf-8" ?>
2: <configuration>
3: <system.web>
4: <compilation debug="false">
5: <assemblies>
6: <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
7: </assemblies>
8: </compilation>
9: </system.web>
10: <system.serviceModel>
11: <services>
12: <service name="WAS.Hello.Service1" behaviorConfiguration="WAS.Hello.ServiceBehavior1">
13: <endpoint address="" binding="wsHttpBinding" contract="WAS.Hello.IService1">
14: <identity>
15: <dns value="localhost"/>
16: </identity>
17: </endpoint>
18: <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
19: </service>
20: </services>
21: <behaviors>
22: <serviceBehaviors>
23: <behavior name="WAS.Hello.ServiceBehavior1">
24: <serviceMetadata httpGetEnabled="true"/>
25: <serviceDebug includeExceptionDetailInFaults="false"/>
26: </behavior>
27: </serviceBehaviors>
28: </behaviors>
29: </system.serviceModel>
30:
31: </configuration>
- W Menedżerze IIS postępujemy analogicznie jak przy hostowaniu binarki dll.
- Odpalamy nasz serwis pod adresem http://localhost/HelloCode/Service.svc.
IIS
Serwisy hostowane w ramach IIS są dostępne jedynie za pomocą protokołu HTTP. Możemy dołączyć je do istniejącej aplikacji ASP.NET, lub utworzyć nową aplikacją, jak też zrobimy.
Instalacja
Jeżeli nie mamy jeszcze skonfigurowanej obsługi stron w IIS należy doinstalować kilka komponentów. W ramach sekcji Internetowe usługi informacyjne dodajemy kilka elementów:

Uwaga: Nie gwarantuję, że jest to minimalny zestaw komponentów potrzebnych do uruchomienia usługi. Jeżeli po instalacji wejdziemy pod adres http://localhost/ i zobaczymy okno powitalne serwera IIS, oznacza to, że mamy duże szanse, że nasz serwis się uruchomi.

Szykujemy kod
Zakładając, że jeszcze przed rozpoczęciem pisania serwisu wiemy, że będzie on hostowany za pomocą IIS możemy podjąć odpowiednie kroki w Visual Studio:
- Wybieramy File, New, Web Site…, WCF Service. Nazwijmy go IIS.Hello.
- Wygenerowany katalog IIS.Hello kopiujemy do C:\inetpub\wwwroot,
- Uruchamiamy Menedżer IIS, dodajemy aplikację IIS.Hello.
- Odpalamy http://localhost/IIS.Hello/Service.svc.
MSMQ
MSMQ to usługa kolejkowania wiadomości. Nie jest on wykorzystywany w tej lekcji. Na egzamin warto wiedzieć, że:
- Jeśli jednak chcemy aktywować MSMQ należy zainstalować Podstawowe funkcje serwera usługi MSMQ:
- Należy także uruchomić usługę Net.Msmq Listener Adapter.
- Tworząc kolejkę dla serwisu należy nadać jej nazwę postaci MyServiceHost/Service.svc, gdzie MyServiceHost to nazwa naszego projektu hostującego serwis, Service.svc – plik serwisu.
- Należy nadać uprawnienia receive oraz peek dla konta NETWORK SERVICE (nie znalazłem tego),
- W pliku web.config należy dodać endpoint (nie element MSMQ!), który będzie wskazywał na utworzoną kolejkę. Dla powyższej kolejki wpis może wyglądać tak:
1: <endpoint
2: address="net.msmq://localhost/private/MyServiceHost/Service.svc"
3: binding="netMsmqBinding"
4: contract="IService1" />
W następnej lekcji można będzie przeczytać o hostowaniu serwisów WCF z poziomu własnej aplikacji w kodzie zarządzanym.