Konfigurowanie wiązań dla usług WCF (Windows Communication Foundation)
Podczas tworzenia aplikacji często chcesz odroczyć decyzje administratora po wdrożeniu aplikacji. Na przykład często nie ma możliwości wcześniejszego poznania adresu usługi lub identyfikatora URI (Uniform Resource Identifier). Zamiast trwale kodować adres, lepiej jest zezwolić administratorowi na to po utworzeniu usługi. Ta elastyczność jest osiągana przez konfigurację.
Uwaga
Użyj narzędzia ServiceModel Metadata Tool (Svcutil.exe) z przełącznikiem/config
, aby szybko utworzyć pliki konfiguracji.
Główne sekcje
Schemat konfiguracji programu Windows Communication Foundation (WCF) obejmuje następujące trzy główne sekcje (serviceModel
, bindings
i services
):
<configuration>
<system.serviceModel>
<bindings>
</bindings>
<services>
</services>
<behaviors>
</behaviors>
</system.serviceModel>
</configuration>
Elementy modelu ServiceModel
Sekcję powiązaną z elementem system.ServiceModel
można użyć do skonfigurowania typu usługi z co najmniej jednym punktem końcowym, a także ustawieniami usługi. Każdy punkt końcowy można następnie skonfigurować przy użyciu adresu, kontraktu i powiązania. Aby uzyskać więcej informacji na temat punktów końcowych, zobacz Omówienie tworzenia punktu końcowego. Jeśli nie określono żadnych punktów końcowych, środowisko uruchomieniowe dodaje domyślne punkty końcowe. Aby uzyskać więcej informacji na temat domyślnych punktów końcowych, powiązań i zachowań, zobacz Uproszczone konfigurowanie i uproszczona konfiguracja usług WCF.
Powiązanie określa transporty (HTTP, TCP, potoki, kolejkowanie komunikatów) i protokoły (zabezpieczenia, niezawodność, przepływy transakcji) i składa się z elementów powiązania, z których każdy określa aspekt sposobu komunikacji punktu końcowego ze światem.
Na przykład określenie podstawowego <elementuHttpBinding> oznacza użycie protokołu HTTP jako transportu dla punktu końcowego. Służy to do podłączania punktu końcowego w czasie wykonywania, gdy usługa korzystająca z tego punktu końcowego jest otwarta.
Istnieją dwa rodzaje powiązań: wstępnie zdefiniowane i niestandardowe. Wstępnie zdefiniowane powiązania zawierają przydatne kombinacje elementów, które są używane w typowych scenariuszach. Aby uzyskać listę wstępnie zdefiniowanych typów powiązań udostępnianych przez program WCF, zobacz Powiązania dostarczone przez system. Jeśli żadna wstępnie zdefiniowana kolekcja powiązań nie ma poprawnej kombinacji funkcji, których potrzebuje aplikacja usługi, możesz utworzyć powiązania niestandardowe spełniające wymagania aplikacji. Aby uzyskać więcej informacji na temat powiązań niestandardowych, zobacz customBinding>.<
W poniższych czterech przykładach przedstawiono najbardziej typowe konfiguracje powiązań używane do konfigurowania usługi WCF.
Określanie punktu końcowego do użycia typu powiązania
Pierwszy przykład ilustruje sposób określania punktu końcowego skonfigurowanego przy użyciu adresu, kontraktu i powiązania.
<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
<!-- This section is optional with the default configuration introduced
in .NET Framework 4. -->
<endpoint
address="/HelloWorld2/"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding" />
</service>
W tym przykładzie name
atrybut wskazuje typ usługi, dla którego jest włączona konfiguracja. Podczas tworzenia usługi w kodzie za pomocą kontraktu HelloWorld
jest inicjowany ze wszystkimi punktami końcowymi zdefiniowanymi w przykładowej konfiguracji. Jeśli zestaw implementuje tylko jeden kontrakt usługi, atrybut można pominąć, name
ponieważ usługa używa jedynego dostępnego typu. Atrybut przyjmuje ciąg, który musi być w formacie Namespace.Class, AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
Atrybut address
określa identyfikator URI używany przez inne punkty końcowe do komunikowania się z usługą. Identyfikator URI może być ścieżką bezwzględną lub względną. Jeśli podany jest adres względny, host powinien podać adres podstawowy, który jest odpowiedni dla schematu transportu używanego w powiązaniu. Jeśli adres nie jest skonfigurowany, przyjmuje się, że adres podstawowy jest adresem tego punktu końcowego.
Atrybut contract
określa kontrakt, który ujawnia ten punkt końcowy. Typ implementacji usługi musi implementować typ kontraktu. Jeśli implementacja usługi implementuje pojedynczy typ kontraktu, tę właściwość można pominąć.
Atrybut binding
wybiera wstępnie zdefiniowane lub niestandardowe powiązanie, które ma być używane dla tego konkretnego punktu końcowego. Punkt końcowy, który nie wybiera jawnie powiązania, używa domyślnego wyboru powiązania, czyli BasicHttpBinding
.
Modyfikowanie wstępnie zdefiniowanego powiązania
W poniższym przykładzie zmodyfikowano wstępnie zdefiniowane powiązanie. Następnie można go użyć do skonfigurowania dowolnego punktu końcowego w usłudze. Powiązanie jest modyfikowane przez ustawienie ReceiveTimeout wartości na 1 sekundę. Należy pamiętać, że właściwość zwraca TimeSpan obiekt.
To zmienione powiązanie znajduje się w sekcji powiązania. To zmienione powiązanie można teraz użyć podczas tworzenia dowolnego punktu końcowego, ustawiając binding
atrybut w elemecie endpoint
.
Uwaga
Jeśli nadasz określoną nazwę powiązaniu, bindingConfiguration
określony w punkcie końcowym usługi musi być zgodny z nim.
<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
<endpoint
address="/HelloWorld2/"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding" />
</service>
<bindings>
<basicHttpBinding
receiveTimeout="00:00:01"
/>
</bindings>
Konfigurowanie zachowania w celu zastosowania do usługi
W poniższym przykładzie dla typu usługi skonfigurowano określone zachowanie. Element ServiceMetadataBehavior
służy do włączania narzędzia ServiceModel Metadata Tool (Svcutil.exe) w celu wysyłania zapytań do usługi i generowania dokumentów języka WSDL (Web Services Description Language) z metadanych.
Uwaga
Jeśli nadasz określoną nazwę zachowaniu, behaviorConfiguration
określona w sekcji usługi lub punktu końcowego musi być zgodna.
<behaviors>
<behavior>
<ServiceMetadata httpGetEnabled="true" />
</behavior>
</behaviors>
<services>
<service
name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
<endpoint
address="http://computer:8080/Hello"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding" />
</service>
</services>
Poprzednia konfiguracja umożliwia klientowi wywoływanie i pobieranie metadanych usługi typu "HelloWorld".
svcutil /config:Client.exe.config http://computer:8080/Hello?wsdl
Określanie usługi z dwoma punktami końcowymi przy użyciu różnych wartości powiązań
W tym ostatnim przykładzie skonfigurowano dwa punkty końcowe dla HelloWorld
typu usługi. Każdy punkt końcowy używa innego dostosowanego bindingConfiguration
atrybutu tego samego typu powiązania (każdy modyfikuje basicHttpBinding
element ).
<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
<endpoint
address="http://computer:8080/Hello1"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding"
bindingConfiguration="shortTimeout" />
<endpoint
address="http://computer:8080/Hello2"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding"
bindingConfiguration="Secure" />
</service>
<bindings>
<basicHttpBinding
name="shortTimeout"
timeout="00:00:00:01"
/>
<basicHttpBinding
name="Secure">
<Security mode="Transport" />
</basicHttpBinding>
</bindings>
To samo zachowanie można uzyskać przy użyciu konfiguracji domyślnej, dodając sekcję protocolMapping
i konfigurując powiązania, jak pokazano w poniższym przykładzie.
<protocolMapping>
<add scheme="http" binding="basicHttpBinding" bindingConfiguration="shortTimeout" />
<add scheme="https" binding="basicHttpBinding" bindingConfiguration="Secure" />
</protocolMapping>
<bindings>
<basicHttpBinding
name="shortTimeout"
timeout="00:00:00:01"
/>
<basicHttpBinding
name="Secure" />
<Security mode="Transport" />
</bindings>