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, bindingsi 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 basicHttpBindingelement ).

<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>  

Zobacz też