Plan Literatura Podstawowe pojęcia Programowanie Systemów Rozproszonych - WCF Paweł Paduch Politechnika Świętokrzyska 15 kwietnia 2015 Paweł Paduch Programowanie Systemów Rozproszonych - WCF 1 z 70
Plan wykładu Plan Literatura Podstawowe pojęcia 1 Plan Literatura Podstawowe pojęcia 2 Prosty kalkulator Klient 3 Self Hosting Usługi Windows Web Hosted 4 Paweł Paduch Programowanie Systemów Rozproszonych - WCF 2 z 70
Literatura Plan Literatura Podstawowe pojęcia Dokumentacja MSDN - https://msdn.microsoft.com/enus/library/dd456779(v=vs.110).aspx Paweł Paduch Programowanie Systemów Rozproszonych - WCF 3 z 70
Co to jest WCF? Plan Literatura Podstawowe pojęcia WCF (Windows Comunication Foundation - kodowa nazwa Indygo) jest środowiskiem uruchomieniowym i zestawem API do stworzenia systemu wysyłającego komunikaty pomiędzy klientami a serwisami. Paweł Paduch Programowanie Systemów Rozproszonych - WCF 4 z 70
SOA Plan Literatura Podstawowe pojęcia SOA - (Service Oriented Architecture). Architektura oparta na przesyłaniu komunikatów. Serwis ma zaletę bycia luźno powiązanym z innymi aplikacjami co oznacza, że jesteśmy uniezależnieni od architektury sprzętowej i programowej byleby kluczowe kontrakty były spełnione. Paweł Paduch Programowanie Systemów Rozproszonych - WCF 5 z 70
Interoperacyjność Plan Literatura Podstawowe pojęcia WCF implementuje nowoczesne standardy produkcyjne Web serwisów. Takich jak: COM, COM+.NET Remoting Web Service Enhancements 3.0 ASP.NET Web Services POX Plain Old XML Paweł Paduch Programowanie Systemów Rozproszonych - WCF 6 z 70
Multiple Message Patterns Plan Literatura Podstawowe pojęcia Komunikaty są wymieniane w jednym z wielu paternów: request/reply najbardziej popularny, jeden EP (Endpoint) żąda danych od drugiego, który mu odpowiada. wymiana jednostronna (One Way) jeden EP wysyła dane, ale bez żądania odpowiedzi Duplex - wymiana dwukierunkowa Więcej na temat implementacji własnych paternów można znaleźć tu: https://msdn.microsoft.com/en-us/library/aa702732(v=vs.110).aspx Paweł Paduch Programowanie Systemów Rozproszonych - WCF 7 z 70
Service Metadata Plan Literatura Podstawowe pojęcia WCF wspiera publikowanie metadanych przez serwis za pomocą takich standardów jak: WSDL XML Schema WS-Policy Dane te mogą być (i zwykle są) używane do automatycznego generowania konfiguracji oraz klas klienta. Mogą być dostarczane przez HTTP, HTTPS lub używając Web Service Metadata Exchange. Więcej na ten temat tu: https://msdn.microsoft.com/en-us/library/ms731823(v=vs.110).aspx Paweł Paduch Programowanie Systemów Rozproszonych - WCF 8 z 70
Podstawowe pojęcia Plan Literatura Podstawowe pojęcia Message - Samodzielna jednostka danych składająca się z kilku części, zwykle nagłówka i treści Service - Konstrukt wystawiający jeden lub więcej punktów końcowych (Endpoint), z których to można udostępnić jedną lub więcej operacji Endpoint - Konstrukt do którego lub z którego komunikaty są wysyłane i/lub odbierane. Składa się z lokalizacji (adresu) gdzie wiadomości mogą być wysyłane, specyfikacji mechanizmu komunikacji (binding), który określa w jaki sposób komunikaty powinny być wysyłane, oraz definicji zestawu komunikatów które mogą być wysłane do/z serwisu (service contract), opisuje jakie komunikaty mogą być wysłane czy odebrane. Paweł Paduch Programowanie Systemów Rozproszonych - WCF 9 z 70
Podstawowe pojęcia Plan Literatura Podstawowe pojęcia Application Endpoint - endpoint udostępniony przez aplikacje, który jest związany z kontraktem serwisu zaimplementowanego przez tę aplikację infrastructure endpoint - endpoint udostępniony przez infrastrukturę aby ułatwić funkcjonalność potrzebną lub dostarczoną przez serwis, która nie jest związana z kontraktami serwisu. Np. Serwis może mieć endpoint infrastrukturalny, który dostarcza metadanych. address - określa miejsce odbioru wiadomości w postaci URI, część adresu określa jaki mechanizm transportowy ma być użyty np. HTTP, TCP, reszta to unikalna lokacja a jej budowa zależy od mechanizmu transportowego. Np. https://serwer.gdzies.pl:8088/myservices/kalkulatorserwis Paweł Paduch Programowanie Systemów Rozproszonych - WCF 10 z 70
Podstawowe pojęcia Plan Literatura Podstawowe pojęcia binding - Określa w jaki sposób endpoint komunikuje się ze światem. zbudowany jest z zestawu komponentów zwanych (binding elements) które ułożone są w stos jeden na drugim, aby stworzyć infrastrukturę komunikacyjną. Na samym końcu binding definiuje transport ( TCP, HTTP) i używane kodowanie (text, bin), binding może zawierać elementy określające szczegóły mechanizmów zabezpieczających. Więcej informacji o konfiguracji serwisów znaleźć można tu: https://msdn.microsoft.com/enus/library/ms733830(v=vs.110).aspx binding element - reprezentuje pojedynczy element bindingu, taki jak transport, kodowanie, implementację protokołu (np. WS-ReliableMessaging), lub inne elementy stosu komunikacyjnego. Paweł Paduch Programowanie Systemów Rozproszonych - WCF 11 z 70
Podstawowe pojęcia Plan Literatura Podstawowe pojęcia behaviors - komponent, który kontroluje wiele aspektów podczas działania serwisu. Zachowania są grupowane według zakresów: common behaviors - wpływa na wszystkie punkty końcowe w sposób globalny service behaviors - zachowanie dotyczące serwisów endpoint behaviors - zachowanie dotyczące właściwości endpointów operation-level behaviors - wpływa na zachowanie poszczególnych operacji Można określić np. czy serwis ma zwracać informacje debugerskie, ograniczać dostęp czy w jaki sposób używane mają być poświadczenia. Paweł Paduch Programowanie Systemów Rozproszonych - WCF 12 z 70
Podstawowe pojęcia Plan Literatura Podstawowe pojęcia system-provided bindings - WCF posiada wiele wbudowanych systemowych bindingów zoptymalizowanych pod specyficzne scenariusze np. WSHttpBinding. Te predefiniowane bindingi oszczędzając czas pozwalają tylko na te zmiany które są sensowne dla danego scenariusza. Oczywiście można stworzyć swój własny binding. configuration versus coding - sterowanie zachowaniem aplikacji może być przy pomocy zarówno plików konfiguracyjnych (wtedy np. administrator systemu może wpływac na zachowanie różnych aspektów działania aplikacji) jak i bezpośrednio w kodzie w którym można sprawdzić konfigurację i ją nadpisać. Paweł Paduch Programowanie Systemów Rozproszonych - WCF 13 z 70
Podstawowe pojęcia Plan Literatura Podstawowe pojęcia service operation - procedura zdefiniowane w kodzie serwisu, która implementuje funkcjonalność operacji. Taka operacja jest wystawiona klientowi jako metoda WCF. Metody mogą pobierać 0 lub więcej argumentów, mogą też zwracać wynik lub nie. service contract - łączy wiele zależnych operacji w pojedynczą funkcjonalną jednostkę. W większości przypadków kontrakt jest definiowany za pomocą interfejsu w odpowiednim języku programowania (np. C#) gdzie stosuje się atrybuty ServiceContractAttribute Paweł Paduch Programowanie Systemów Rozproszonych - WCF 14 z 70
Podstawowe pojęcia Plan Literatura Podstawowe pojęcia operation contract - definiuje parametry i typy zwracane przez operację. Kiedy tworzymy interfejs definiujący service contrat, oznaczamy operation contract za pomocą atrybutów OperationContractAttribute dla każdej definicji metody, która jest częścią tego kontraktu. message contract - Opisuje format komunikatu, np. można określić czy elementy komunikatu powinny być umieszczone w nagłówku czy w treści wiadomości, jaki poziom bezpieczeństwa powinien być zastosowany itp. Paweł Paduch Programowanie Systemów Rozproszonych - WCF 15 z 70
Podstawowe pojęcia Plan Literatura Podstawowe pojęcia fault contract - związany z service operation opisuje jakie błędy mogą być zwrócone (0 lub więcej). Zwracane są jako błędy SOAP. data contract - informacja zawarta w metadanych opisująca typy danych używane przez serwis. Dzięki temu inni mogą współpracować z serwisem. Opisane typy danych mogą być używane w dowolnym miejscu komunikatu jako parametry wejściowe lub typy zwracane. W przypadku typów prostych nie ma potrzeby używania data cotracts. hosting - serwis musi być umieszczony w jakimś procesie. Host jest aplikacją która kontroluje czas życia serwisu. Serwis może być samohostujący lub korzystać z istniejącego procesu np IIS. Paweł Paduch Programowanie Systemów Rozproszonych - WCF 16 z 70
Podstawowe pojęcia Plan Literatura Podstawowe pojęcia self-hosted service - serwis samohostujący. Gdy serwis działa w obrębie procesu stworzonego przez programistę. Programista kontroluję, czas życia takiego serwisu, otwiera go w trybie nasłuchu i zamyka gdy nie jest już używany. hosting process - proces hostujący, to aplikacja która jest przeznaczona do hostowania serwisu. IIS, WAS (Windows Activation Services), Sharepoint oraz usługi Windows. W tych wszystkich przypadkach host jest odpowiedzialny za czas życia serwisu. Można np. przy pomocy IIS utworzyć katalog wirtualny w którym będą umieszczone biblioteki i pliki konfiguracyjne dla serwisu. Paweł Paduch Programowanie Systemów Rozproszonych - WCF 17 z 70
Podstawowe pojęcia Plan Literatura Podstawowe pojęcia instancing - Serwis ma trzy modele instancji: single - gdzie pojedynczy obiekt CLR obsługuje wszystkich klientów per call - gdzie do obsługi każdego nowego klienta jest tworzony nowy obiekt CLR per session - gdzie obiekt jest tworzony raz na każdą sesję. client application - program który wymienia komunikaty z jednym lub wieloma punktami końcowymi. Aplikacja kliencka zaczyna od stworzenia instancji klienta WCF oraz zawołania metod klienta WCF. Pojedyncza aplikacja może być zarówno klientem jak i serwisem. Paweł Paduch Programowanie Systemów Rozproszonych - WCF 18 z 70
Podstawowe pojęcia Plan Literatura Podstawowe pojęcia channel - konkretna implementacja elementu wiążącego (binding element). Wiązanie reprezentuje konfiguracje a kanał jest implementacją związaną z tą konfiguracją. Dlatego z każdym elementem wiążącym jest związany kanał. Kanały też są ułożone w postaci stosu kanałów (channel stack). WCF client - konstrukt aplikacji klienckiej który udostępnia operacje serwisu jako metody w wybranym języku (np. C#). Każda aplikacja może hostować klienta WCF włącznie z aplikacją która hostuje sam serwis. Dlatego jest możliwe stworzenie serwisu, który korzysta z usług innych serwisów. Klient WCF może być automatycznie utworzony za pomocą Svcutil.exe lub przez dodanie Service References w Visual Studio. Paweł Paduch Programowanie Systemów Rozproszonych - WCF 19 z 70
Podstawowe pojęcia Plan Literatura Podstawowe pojęcia metadata - Opisuje charakterystykę serwisu aby zewnętrzne systemy potrafiły się z nim skomunikować. Metadane mogą być użyte przez SvcUtil.exe do wygenerowania biblioteki klienta oraz odpowiedniej konfiguracji. Metadane są wystawione jako dokument XML w którym opisywane są kontrakty, oraz WDSL w którym opisane są metody udostępniane. Żeby udostępnić metadane należy je włączyć w metadata behaviour. Paweł Paduch Programowanie Systemów Rozproszonych - WCF 20 z 70
Podstawowe pojęcia Plan Literatura Podstawowe pojęcia security - na bezpieczeństwo WCF skłądają się między innymi: poufność - wiadomości mogą być szyfrowane uczciwość - jest możliwość wykrywania manipulacji na wiadomościach autentykacja - możliwość uwierzytelniania serwerów i klientów autoryzacja - kontrola dostępu do zasobów Funkcje te są świadczone zarówno przez wykorzystanie istniejących mechanizmów bezpieczeństwa, takich jak HTTPS, lub w drodze jednej lub więcej implementacji bezpieczeństwa WS- * WS-* - Skrót wszystkich specyfikacji Web Serwisów (WS) zaimplementowanych w WCF takich jak WS-Security, WS-ReliableMessaging itp. Paweł Paduch Programowanie Systemów Rozproszonych - WCF 21 z 70
Podstawowe pojęcia Plan Literatura Podstawowe pojęcia transport security mode - zapewnia że poufność integralność i autentykacja są zapewnione przez z mechanizmy warstwy pośredniej np. takiej jak HTTPS. message security mode - Określa że zabezpieczenie jest zapewnione przez implementowanie jednej lub więcej specyfikacji bezpieczeństwa takich jak Web Services Security: SOAP Message Security. Każda wiadomość zawiera mechanizmy zabezpieczające ją podczas transportu, wykrywania sabotażu i możliwości dekodowania przez prawowitego odbiorcę. Każda wiadomość może zawierać wiele poświadczeń. transport with message credential security mode - Określa użycie warstwy transportowej w celu zapewnienia poufności integracji i autentykacji wiadomości Paweł Paduch Programowanie Systemów Rozproszonych - WCF 22 z 70
Zakładamy nową solucję Prosty kalkulator Klient Po otworzeniu Visual Studio File New Project (ctrl+shift+n) Rysunek: Zakładanie nowego projektu / solucji. Paweł Paduch Programowanie Systemów Rozproszonych - WCF 23 z 70
Zmiana nazwy Prosty kalkulator Klient W Solution expolorerze po prawej stronie zmieniamy IService1.cs na IServiceCalc.cs oraz Service1.cs na ServiceCalc.cs Rysunek: Zmiana nazw Paweł Paduch Programowanie Systemów Rozproszonych - WCF 24 z 70
App.config Prosty kalkulator Klient Zmiany powinny też nastąpić w App.config zmieniamy nazwy serwisu, adres i endopointy Listing 1: App.config 1 <system.servicemodel> 2 <services> 3 <service name="simplecalc.servicecalc"> 4 <host> 5 <baseaddresses> 6 <add baseaddress = "http://localhost:8733 /Design_Time_Addresses/SimpleCalc/ServiceCalc/" /> 7 </baseaddresses> 8 </host> 9 <!-- Service Endpoints --> 10 <!-- Unless fully qualified, address is relative to base address supplied above --> 11 <endpoint address="" binding="basichttpbinding" contract="simplecalc.iservicecalc"> Mamy właściwie gotowy przykładowy serwis, który nam odpowie czymś co podamy. Paweł Paduch Programowanie Systemów Rozproszonych - WCF 25 z 70
Pierwsze uruchomienie Prosty kalkulator Klient Wciskami F5 uruchomi nam serwis oraz przykładowy klient, którym możemy przetestować wywołanie dwóch metod: GetData oraz GetDataUsingDataContract Rysunek: Testowy klient Paweł Paduch Programowanie Systemów Rozproszonych - WCF 26 z 70
Kontrakty Prosty kalkulator Klient W interfejsie zawarte są atrybuty opisujące kontrakty Interfejs - to nasz ServiceContract Metody oznaczone są jako OperationContract Klasa transportowa to DataContract Posiada ona pola właściwości oznaczone jako DataMember Paweł Paduch Programowanie Systemów Rozproszonych - WCF 27 z 70
IServiceCalc Prosty kalkulator Klient Listing 2: Interfejs IServiceCalc.cs 1 [ServiceContract] 2 public interface IServiceCalc 3 { 4 [OperationContract] 5 string GetData(int value); 6 [OperationContract] 7 CompositeType GetDataUsingDataContract(CompositeType composite); 8 } Paweł Paduch Programowanie Systemów Rozproszonych - WCF 28 z 70
IServiceCalc Prosty kalkulator Klient Przerabiamy Interfejs 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Runtime.Serialization; 5 using System.ServiceModel; 6 using System.Text; 7 namespace SimpleCalc 8 { 9 [ServiceContract] 10 public interface IServiceCalc 11 { 12 [OperationContract] 13 double dodaj(double a, double b); 14 [OperationContract] 15 double odejmij(double a, double b); 16 [OperationContract] 17 double mnoz(double a, double b); 18 [OperationContract] 19 double dziel(double a, double b); 20 } 21 } Listing 3: Interfejs IServiceCalc.cs Paweł Paduch Programowanie Systemów Rozproszonych - WCF 29 z 70
ServiceCalc Prosty kalkulator Klient Przerabiamy implementację serwisu Listing 4: Implementacja ServiceCalc.cs 1 namespace SimpleCalc 2 { 3 public class ServiceCalc : IServiceCalc 4 { 5 public double dodaj(double a, double b) 6 { return a + b; } 7 public double odejmij(double a, double b) 8 { return a - b; } 9 public double mnoz(double a, double b) 10 { return a * b; } 11 public double dziel(double a, double b) 12 { 13 if (b!= 0) 14 return a / b; 15 else 16 throw new DivideByZeroException("Parametr nie moze byc a = 0"); 17 } 18 } 19 } Paweł Paduch Programowanie Systemów Rozproszonych - WCF 30 z 70
Drugie uruchomienie Prosty kalkulator Klient Przy drugiej próbie uruchomienia od razu sprawdzamy zachowanie na dzielenie przez 0. Serwer nie mógł przetworzyć żądania z powodu błędu wewnętrznego. Aby uzyskać więcej informacji dotyczących tego błędu, włącz parametr IncludeExceptionDetailInFaults (w atrybucie ServiceBehaviorAttribute lub zachowaniu konfiguracji <servicedebug>) na serwerze w celu odsyłania informacji o wyjątkach do klienta albo włącz śledzenie, tak jak opisano w dokumentacji zestawu Microsoft.NET Framework SDK i przejrzyj dzienniki śledzenia serwera. Paweł Paduch Programowanie Systemów Rozproszonych - WCF 31 z 70
Prosty kalkulator Klient Włączamy includeexceptiondetailinfaults W App.config włączamy includeexceptiondetailinfaults na true: Listing 5: App.config 1 <servicedebug includeexceptiondetailinfaults="true" /> I już mamy dodatkowe informacje na temat błędu. Paweł Paduch Programowanie Systemów Rozproszonych - WCF 32 z 70
Podgląd z przeglądarki Prosty kalkulator Klient Gdy uruchomimy serwis oraz wkleimy adres http://localhost:8733/design Time Addresses/SimpleCalc/ServiceCalc do przeglądarki pojawi nam się strona z informacją jak użyć usługi. Między innymi adres informacji WSDL oraz fragmenty kodu C# oraz Visual Basic Listing 6: Przykładowy kod klienta 1 class Test 2 { 3 static void Main() 4 { 5 ServiceCalcClient client = new ServiceCalcClient(); 6 7 // Użyj zmiennej client" do wywoływania operacji dla usługi. 8 9 // Zawsze zamykaj klienta. 10 client.close(); 11 } 12 } Paweł Paduch Programowanie Systemów Rozproszonych - WCF 33 z 70
Nowy projekt Prosty kalkulator Klient W Solution Explorerze zakładamy nowy projekt ClientCalc Rysunek: Dodanie projektu klienta Paweł Paduch Programowanie Systemów Rozproszonych - WCF 34 z 70
Service Reference Prosty kalkulator Klient Uruchamiamy serwis w trybie nie debugerskim (ctrl+f5) Klikamy prawym klawiszem myszy na projekt klienta i wybieramy Add Service Reference. Wklejamy adres ten co w przeglądarce http://localhost:8733/design Time Addresses/SimpleCalc/ServiceCalc/ Klikamy Go. Powinien nam się znaleźć nasz serwis z wystawionymi metodami. Zmieniamy nazwę na ServiceReferenceCalc klikamy OK Paweł Paduch Programowanie Systemów Rozproszonych - WCF 35 z 70
Service Reference Prosty kalkulator Klient Rysunek: Dodanie referencji Paweł Paduch Programowanie Systemów Rozproszonych - WCF 36 z 70
Dodatkowe ustawienia projektu Prosty kalkulator Klient W Solution Explorerze klikamy prawym klawiszem myszy na na Solucji i wybieramy Properties (Alt+Enter) Ustawiamy Multiple startup project oraz Action na Start, zmieniając też kolejność uruchomienia (najpierw powinien wystartować serwer). Rysunek: Właściwości Solucji Paweł Paduch Programowanie Systemów Rozproszonych - WCF 37 z 70
Poprawki w kodzie klienta Prosty kalkulator Klient Dodajemy przestrzeń nazw ClientCalc.ServiceReferenceCalc. Można teraz uruchomić i sprawdzić działanie klienta z serwisem. Listing 7: Przykładowy kod klienta 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using ClientCalc.ServiceReferenceCalc; 7 namespace ClientCalc 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 ServiceCalcClient client = new ServiceCalcClient(); 14 Console.WriteLine("Serwis twierdzi ze 2 + 8 to {0}", client.dodaj(2, 8).ToString()); 15 Console.ReadLine(); 16 client.close(); 17 } 18 } 19 } Paweł Paduch Programowanie Systemów Rozproszonych - WCF 38 z 70
Hostowanie Self Hosting Usługi Windows Web Hosted Sama biblioteka którą stworzyliśmy nie może serwować usług, trzeba ją hostować - osadzić w jakiejś aplikacji. Gdy uruchamiamy nasz projekt w trybie debugowania, jest on hostowany przez WCF Service Host (WcfSvcHost.exe) Self Host - prosta aplikacja w której tworzymy instancję klasy ServiceCalc Windows Service - WS jest hostowany przez usługę windows Web Host - hostowanie na serwerze IIS WAS - Windows Process Activation Service SharePoint Więcej na ten temat tu: https://msdn.microsoft.com/en-us/library/ms730158(v=vs.110).aspx Paweł Paduch Programowanie Systemów Rozproszonych - WCF 39 z 70
Self Hosting Usługi Windows Web Hosted Dodajemy nowy projekt konsolowy Dodajemy nowy projekt konsolowy SelfHostService Dodajemy dwie przestrzenie nazw System.ServiceModel oraz System.ServiceModel.Description oraz referencję do System.ServiceModel Tworzymy serwis lub dodajemy referencję do biblioteki zawierającej serwis i dodajemy przestrzeń nazw SimpleCalc Na samym początku Maina tworzymy instancje Uri baseaddress = new Uri( http://localhost:8080/kalkulator ) Dodajemy instancję ServiceHost podając nasz typ serwisu ServiceCalc Przestawiamy w ustawieniach Solucji, aby uruchomił się projekt SelfHostService Paweł Paduch Programowanie Systemów Rozproszonych - WCF 40 z 70
Self Hosted Service Self Hosting Usługi Windows Web Hosted Listing 8: Kod aplikacji hostującej serwis 1 static void Main(string[] args) 2 { 3 Uri baseaddress = new Uri("http://localhost:8080/Kalkulator"); 4 using (ServiceHost host = new ServiceHost(typeof(ServiceCalc), baseaddress)) 5 { 6 ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); 7 smb.httpgetenabled = true; 8 smb.metadataexporter.policyversion = PolicyVersion.Policy15; 9 host.description.behaviors.add(smb); 10 host.open(); 11 Console.WriteLine("Serwis czeka na {0}", baseaddress); 12 Console.WriteLine("Aby zakonczyc nacisnij Enter"); 13 Console.ReadLine(); 14 host.close(); 15 } 16 } Paweł Paduch Programowanie Systemów Rozproszonych - WCF 41 z 70
Problem z uprawnieniami Self Hosting Usługi Windows Web Hosted Niestety, aplikacja hostująca serwis musi być uruchomiona z uprawnieniami administratora, inaczej dostaniemy poniższy błąd: Protokół HTTP nie może zarejestrować adresu URL http://+:8080/kalkulator/. Używany proces nie ma praw dostępu do przestrzeni nazw (aby uzyskać szczegółowe informacje, zobacz http://go.microsoft.com/fwlink/?linkid=70353). Paweł Paduch Programowanie Systemów Rozproszonych - WCF 42 z 70
Problem z uprawnieniami Self Hosting Usługi Windows Web Hosted Rozwiązaniem może być uruchomienie VS jako administrator lub z konsoli administratora dodać uprawnienia: netsh http add urlacl url=http://+:8080/kalkulator user=kowalski lub jeszcze mniej restrykcyjnie netsh http add urlacl url=http://+:8080/kalkulator user=wszyscy Usunięcie uprawnień: netsh http delete urlacl url=http://+:8080/kalkulator Paweł Paduch Programowanie Systemów Rozproszonych - WCF 43 z 70
Usługi Self Hosting Usługi Windows Web Hosted Gdy serwis ma działać non stop, uruchamiać się wraz ze startem systemu, dobrym pomysłem jest umieszczenie go w zarządzalnych usługach. Klasa usługi dziedziczy po ServiceBase Czas życia serwisu jest zarządzany przez Service Control Manager - SCM Serwis startuje w metodzie OnStart a usuwamy go w OnStop. Paweł Paduch Programowanie Systemów Rozproszonych - WCF 44 z 70
Nowy projekt Windows Service Self Hosting Usługi Windows Web Hosted Dodajemy nowy projekt typu Windows Service o nazwie CalkService Rysunek: Dodanie projektu CalcService Paweł Paduch Programowanie Systemów Rozproszonych - WCF 45 z 70
Zmiana nazwy Self Hosting Usługi Windows Web Hosted Zmieniamy nazwę Service1.cs na MojaUslugaKalk.cs Dodajemy referencję do projektu SimpleCalc Dodajemy referencje do System.ServiceModel.dll Dodajemy using System.ServiceModel; W MojaUsługaKalk.cs dodajemy pole private ServiceHost m svchost = null; Paweł Paduch Programowanie Systemów Rozproszonych - WCF 46 z 70
MojaUsługaKalk.cs Self Hosting Usługi Windows Web Hosted Listing 9: Kod MojaUslugaKalk.cs 1 //...// 2 using System.ServiceModel; 3 using System.ServiceProcess; 4 5 namespace CalkService 6 { 7 public partial class MojaUslugaKalk : ServiceBase 8 { 9 private ServiceHost m_svchost = null; 10 public MojaUslugaKalk() 11 { 12 InitializeComponent(); 13 } 14 protected override void OnStart(string[] args) 15 { 16 } 17 protected override void OnStop() 18 { 19 } 20 } 21 } Paweł Paduch Programowanie Systemów Rozproszonych - WCF 47 z 70
OnStart Self Hosting Usługi Windows Web Hosted Listing 10: Kod metody OnStart 1 protected override void OnStart(string[] args) 2 { 3 if (m_svchost!= null) m_svchost.close(); 4 string stradrhttp = "http://localhost:8001/calcservice"; //definicja endpointów 5 string stradrtcp = "net.tcp://localhost:8002/calcservice"; 6 Uri[] adrbase = { new Uri(strAdrHTTP), new Uri(strAdrTCP) }; //inicjujemy i tworzymy obiekt klasy ServiceHost 7 m_svchost = new ServiceHost(typeof(SimpleCalc.ServiceCalc), adrbase); 8 ServiceMetadataBehavior mbehave = new ServiceMetadataBehavior(); //dodajemy zachowania 9 m_svchost.description.behaviors.add(mbehave); 10 BasicHttpBinding httpb = new BasicHttpBinding();//dodanie endpointów 11 m_svchost.addserviceendpoint(typeof(simplecalc.iservicecalc), httpb, stradrhttp); 12 m_svchost.addserviceendpoint(typeof(imetadataexchange), 13 MetadataExchangeBindings.CreateMexHttpBinding(), "mex"); 14 NetTcpBinding tcpb = new NetTcpBinding(); 15 m_svchost.addserviceendpoint(typeof(simplecalc.iservicecalc), tcpb, stradrtcp); 16 m_svchost.addserviceendpoint(typeof(imetadataexchange), 17 MetadataExchangeBindings.CreateMexTcpBinding(), "mex"); 18 m_svchost.open(); 19 } Paweł Paduch Programowanie Systemów Rozproszonych - WCF 48 z 70
OnStop Self Hosting Usługi Windows Web Hosted 1 protected override void OnStop() 2 { 3 if (m_svchost!= null) 4 { 5 m_svchost.close(); 6 m_svchost = null; 7 } 8 } Listing 11: Kod metody OnStop Paweł Paduch Programowanie Systemów Rozproszonych - WCF 49 z 70
Installer Self Hosting Usługi Windows Web Hosted Aby móc zainstalować usługę, należy dodać do projektu jeszcze klasę instalatora CalcServiceInstaller dziedziczącą po Installer oraz referencję do System.Configuration.Install.dll Paweł Paduch Programowanie Systemów Rozproszonych - WCF 50 z 70
Installer Self Hosting Usługi Windows Web Hosted Listing 12: Kod klasy Installer 1 namespace CalkService 2 { 3 [RunInstaller(true)] 4 public class CalcServiceInstaller : Installer 5 { 6 private ServiceProcessInstaller process; 7 private ServiceInstaller service; 8 9 public CalcServiceInstaller() 10 { 11 process = new ServiceProcessInstaller(); 12 process.account = ServiceAccount.LocalSystem; 13 service = new ServiceInstaller(); 14 service.servicename = "Calck Service"; 15 service.description = "Testowa usluga kalkulatora WCF"; 16 service.displayname = "Calc"; 17 service.starttype = ServiceStartMode.Automatic; 18 Installers.Add(process); 19 Installers.Add(service); 20 } 21 } 22 } Paweł Paduch Programowanie Systemów Rozproszonych - WCF 51 z 70
Installer Self Hosting Usługi Windows Web Hosted Po skompilowaniu powinniśmy otrzymać w Bin/Debug plik CalkService.exe Ręczna instalacja polega na wywołaniu z terminala Development Command Prompt (znajduje się w Visual Studio Tools) następującego polecenia. cd < tu nasz katalog z CalkService.exe> installutil CalkService.exe Jeżeli wszystko ok to powinniśmy w usługach windows zauważyć usługę Calc. Wystartowanie ręczne usługi: sc start CalcService Paweł Paduch Programowanie Systemów Rozproszonych - WCF 52 z 70
Problemy Self Hosting Usługi Windows Web Hosted Instalacja usługi powinna odbywać się z prawami Administratora (Uruchom konsolę jako Admin). Jeżeli konto systemowe nie ma dostępu do pliku CalkService.exe wystąpi błąd przy uruchamianiu usługi Odmowa Dostępu - błąd 5. Należy zadbać o to, by katalog, w którym znajduje się serwis oraz sam plik wykonywalny był widoczny przez konto systemowe. Paweł Paduch Programowanie Systemów Rozproszonych - WCF 53 z 70
Właściwości usługi Self Hosting Usługi Windows Web Hosted Można też we właściwościach usługi określić jakim użytkownikiem będzie ona uruchamiana Rysunek: Określenie użytkownika usługi Paweł Paduch Programowanie Systemów Rozproszonych - WCF 54 z 70
Dodanie instalatora Self Hosting Usługi Windows Web Hosted VS oferuje dodanie instalatora z poziomu Designera. Najpierw zakomentujmy kod naszego instalatora Należy otworzyć MojaUslugaKalk.cs w Designerze (Shift+F7) z menu kontekstowego wybrać dodanie instalatora. Rysunek: Dodanie instalatora Paweł Paduch Programowanie Systemów Rozproszonych - WCF 55 z 70
Dodanie instalatora Self Hosting Usługi Windows Web Hosted Zmieniamy domyślną nazwę wygenerowanej klasy ProjectInstaller na CalcServiceInstaller2 Zmieniamy odpowiednio nazwy i właściwości dwóch obiektów calcserviceprocessinstaller oraz calcserviceinstaller We właściwościach calcserviceinstaller ustawiamy Opis i nazwę wyświetlaną Ustawiamy też nazwę usługi na CalcService We właściwościach calcserviceprocessinstaller ustawiamy Account = LocalSystem Instalacja jak poprzednio przez konsole deweloperską. Paweł Paduch Programowanie Systemów Rozproszonych - WCF 56 z 70
Nowy projekt Self Hosting Usługi Windows Web Hosted Dodajemy nowy projekt ASP.NET Web Application Rysunek: Nowy projekt Paweł Paduch Programowanie Systemów Rozproszonych - WCF 57 z 70
Nowy projekt Self Hosting Usługi Windows Web Hosted Wybieramy pusty template Rysunek: Nowy projekt Paweł Paduch Programowanie Systemów Rozproszonych - WCF 58 z 70
Nowy projekt Self Hosting Usługi Windows Web Hosted Dodajemy WCFService Rysunek: Nowy serwis Paweł Paduch Programowanie Systemów Rozproszonych - WCF 59 z 70
ServiceCalc Self Hosting Usługi Windows Web Hosted Usuwamy wygenerowane pliki *.cs Dodajemy referencję do projektu SimpleCalc Podmieniamy kod pliku svc Listing 13: Kod ServiceCalc.svc 1 <%@ ServiceHost Language="C#" Debug="true" Service="SimpleCalc.ServiceCalc" %> Paweł Paduch Programowanie Systemów Rozproszonych - WCF 60 z 70
Web.config Self Hosting Usługi Windows Web Hosted Zmodyfikować plik Web.config jak poniżej: Listing 14: Kod Web.config 1 <?xml version="1.0"?> 2 <configuration> 3 <system.web> 4 <compilation debug="true" targetframework="4.5" /> 5 <httpruntime targetframework="4.5"/> 6 </system.web> 7 <system.servicemodel> 8 <behaviors> 9 <servicebehaviors> 10 <behavior> 11 <servicemetadata httpgetenabled="true" httpsgetenabled="true"/> 12 <servicedebug includeexceptiondetailinfaults="false"/> 13 </behavior> 14 </servicebehaviors> 15 </behaviors> 16 <servicehostingenvironment aspnetcompatibilityenabled="true" multiplesitebindingsenabled= "true" /> 17 </system.servicemodel> 18 <system.webserver> 19 <modules runallmanagedmodulesforallrequests="true"/> 20 <directorybrowse enabled="true"/> 21 </system.webserver> 22 </configuration> Paweł Paduch Programowanie Systemów Rozproszonych - WCF 61 z 70
Dodajemy nową witrynę Self Hosting Usługi Windows Web Hosted W menadżerze internetowych usług informacyjnych (IIS) dodajemy nową witrynę: Rysunek: Nowa witryna Paweł Paduch Programowanie Systemów Rozproszonych - WCF 62 z 70
Konfiguracja nowej witryny Self Hosting Usługi Windows Web Hosted Ustawiamy nazwę, fizyczne położenie WS oraz port Rysunek: Konfiguracja witryny Paweł Paduch Programowanie Systemów Rozproszonych - WCF 63 z 70
.Net 4? Self Hosting Usługi Windows Web Hosted Jeżeli w IIS w domyślnych ustawieniach puli aplikacji jest ustawiona wersja architektury.net Framework na 2.0, to nową pula aplikacji też będzie miała wersję 2.0. Można to zmienić wchodząc w Ustawienia podstawowe wybrane z menu kontekstowego CalcService i wybrać.net 4.x Rysunek: Konfiguracja puli aplikacji Paweł Paduch Programowanie Systemów Rozproszonych - WCF 64 z 70
Publikowanie - profil Self Hosting Usługi Windows Web Hosted Projekt WebHostService można w łatwy sposób wgrać w miejsce docelowe za pomocą narzędzia publikacji. Z menu kontekstowego projektu należy wybrać Publish... i dodać nowy profil Rysunek: Publikacja wybór profilu Paweł Paduch Programowanie Systemów Rozproszonych - WCF 65 z 70
Self Hosting Usługi Windows Web Hosted Publikowanie - ustawienie połączenia Następnie należy wybrać sposób publikacji i miejsce docelowe. Będzie nim katalog określony w konfiguracji aplikacji webowej na IIS. Rysunek: Publikacja - docelowy katalog Dalej można w ustawieniach wybrać Debug po czym kliknąć publikację. Paweł Paduch Programowanie Systemów Rozproszonych - WCF 66 z 70
Publikowanie wersja Web Self Hosting Usługi Windows Web Hosted Można też skonfigurować publikowanie podając adres witryny lokalnej lub zdalnej Rysunek: Publikacja - wersja Web Paweł Paduch Programowanie Systemów Rozproszonych - WCF 67 z 70