niedziela, 15 września 2013

WSDL vs MEX

Aby zewnętrzni producenci oprogramowania mogli skorzystać z naszego serwisu muszą w jakiś sposób pobrać informacje o formacie przesyłanych wiadomości.

Do udostępniania opisu serwisu możemy wykorzystać WSDL (Web Services Description Language) lub MEX (Metadata Exchange Endpoint). Jedno jak i drugie rozwiązanie tworzy opis serwisu - ten sam. Różnica polega na tym, iż w przypadku MEX tworzony jest specjalny endpoint, który zapytany o opis serwisu zwraca opis jako jedna wiadomość SOAP.

Podsumujmy
WSDL:
  • dokument WSDL dostępny jest poprzez wysłanie zapytania HTTP GET - wyświetlić możemy go w przeglądarce
  • dokument WSDL może zawierać odnośniki do innych dokumentów (np. schemy) - podział na wiele dokumentów

MEX:
  • tworzony jest specjalny endpoint udostępniający informacje w formacie SOAP
  • jako odpowiedź otrzymujemy jeden dokument zawierający wszystkie dane o serwisie - brak podziału na wiele dokumentów jak w przypadku WSDL
  • pozwala pobrać klientowi informacje o udostępnianych endpointach co pozwala uniknąć przechowywania konfiguracji ich w konfiguracji aplikacji 
  • możliwość pobrania za pomocą tcp, http, https, named pipes

Kiedy użyć MEX a kiedy WSDL?
WSDL generalnie używamy kiedy nasz serwis korzysta z komunikacji za pomocą HTTP. W przypadku użycia tcp, named pipes czy też innego protokołu - udostępniamy opis serwisu za pomocą  MEX.
Większość napisanych już serwisów korzysta z WSDL - standard ten istnieje na rynku już od dłuższego czasu.


Znając różnice zobaczmy w jaki sposób aktywować udostępnianie WSDL oraz MEX.
WSDL:
W przypadku tworzenia projektu na starcie obsługa WSDL jest włączona domyślnie - nie jest wymagana żadna dodatkowa konfiguracja. Wpis który mówi o aktywności WSDL jest następujący:

<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>


Brak potrzeby definiowania konfiguracji zawdzięczamy domyślnym endpointom, które zostały wprowadzone w wersji 4.0 frameworka.


MEX
Podobnie jak powyższy także nie wymaga żadnej dodatkowej konfiguracji - dostępny jest domyślnie. Jeżeli chcielibyśmy hostować aplikację z udostępnianiem MEX w aplikacji konsolowej, moglibyśmy to zrobić w następujący sposób:


Code:
        static void Main(string[] args)
        {
            var serviceHost = new ServiceHost(typeof(Service1), new Uri("http://localhost/MyService"));
            var smb = serviceHost.Description.Behaviors.Find<ServiceMetadataBehavior>() ?? new ServiceMetadataBehavior();
            smb.HttpGetEnabled = true;
            smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
            serviceHost.Description.Behaviors.Add(smb);
            serviceHost.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
                MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
            serviceHost.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(), "");
            serviceHost.Open();
            foreach (var endpoint in serviceHost.Description.Endpoints)
            {
                Console.WriteLine(endpoint.Address);
            }
            Console.WriteLine("Press key to exit");
            Console.ReadLine();
            serviceHost.Close();
        }


Kod został zaczerpnięty z dokumentacji MSDN.

Podsumowując: WCF umożliwia udostępnianie metadanych na dwa sposoby:


Brak komentarzy:

Prześlij komentarz