Vereinfachte Konfiguration

Das Konfigurieren von WCF-Diensten (Windows Communication Foundation) kann eine komplexe Aufgabe sein. Es gibt viele verschiedene Optionen, und es ist nicht immer einfach zu bestimmen, welche Einstellungen erforderlich sind. Konfigurationsdateien erhöhen zwar die Flexibilität von WCF-Diensten, sind jedoch auch die Quelle für viele Probleme, die nur schwer zu finden sind. .NET Framework 4.6.1 behandelt diese Probleme und gibt Benutzer*innen die Möglichkeit, den Umfang und die Komplexität der Dienstkonfiguration zu verringern.

Vereinfachte Konfiguration

In WCF-Dienstkonfigurationsdateien enthält der <system.serviceModel>-Abschnitt ein <service>-Element für jeden gehosteten Dienst. Das <service>-Element enthält eine Auflistung von <endpoint>-Elementen, die die Endpunkte für die einzelnen Dienste und optional eine Gruppe von Dienstverhaltensweisen angeben. Die <endpoint>-Elemente geben die Adresse, die Bindung und den vom Endpunkt verfügbar gemachten Vertrag sowie optional die Bindungskonfiguration und die Endpunktverhaltensweisen an. Der <system.serviceModel>-Abschnitt enthält auch ein <behaviors>-Element, mit dem Sie Dienst- oder Endpunktverhaltensweisen angeben können. Das folgende Beispiel enthält den <system.serviceModel>-Abschnitt einer Konfigurationsdatei:

<system.serviceModel>
  <behaviors>
    <serviceBehaviors>
      <behavior name="MyServiceBehavior">
        <serviceMetadata httpGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="false" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <bindings>
   <basicHttpBinding>
      <binding name=MyBindingConfig"
               maxBufferSize="100"
               maxReceiveBufferSize="100" />
   </basicHttpBinding>
   </bindings>   <services>
    <service behaviorConfiguration="MyServiceBehavior"
             name="MyService">
      <endpoint address=""
                binding="basicHttpBinding"
                contract="ICalculator"
                bindingConfiguration="MyBindingConfig" />
      <endpoint address="mex"
                binding="mexHttpBinding"
                contract="IMetadataExchange"/>
    </service>
  </services>
</system.serviceModel>

.NET Framework 4.6.1 vereinfacht das Konfigurieren eines WCF-Diensts, indem die Anforderung für das <service>-Element beseitigt wird. Wenn Sie keinen <service>-Abschnitt oder keine Endpunkte in einem <service>-Abschnitt hinzufügen und der Dienst nicht programmgesteuert Endpunkte definiert, wird dem Dienst automatisch ein Satz von Standardendpunkten hinzugefügt (jeweils ein Endpunkt für jede Dienstbasisadresse und für jeden vom Dienst implementierten Vertrag). An jedem dieser Endpunkte entspricht die Endpunktadresse der Basisadresse, die Bindung wird anhand des Basisadressenschemas bestimmt, und der Vertrag ist der Vertrag, der vom Dienst implementiert wird. Wenn es nicht erforderlich ist, Endpunkte oder Dienstverhalten anzugeben oder Änderungen an den Bindungseinstellungen vorzunehmen, müssen Sie keine Dienstkonfigurationsdatei angeben. Wenn ein Dienst zwei Verträge implementiert und der Host sowohl HTTP- als auch TCP-Transporte zulässt, erstellt der Diensthost vier Standardendpunkte, einen für jeden Vertrag mit den einzelnen Transporten. Um Standardendpunkte zu erstellen, muss der Diensthost wissen, welche Bindungen verwendet werden können. Diese Einstellungen werden in einem <protocolMappings>-Abschnitt innerhalb des <system.serviceModel>-Abschnitts angegeben. Der <protocolMappings>-Abschnitt enthält eine Liste von Transportprotokollschemas, die Bindungstypen zugeordnet sind. Der Diensthost verwendet die übergebene Basisadresse, um die zu verwendende Bindung zu ermitteln. Im folgenden Beispiel wird das <protocolMappings>-Element verwendet.

Warnung

Das Ändern von Standardkonfigurationselementen, z. B. Bindungen oder Verhalten, wirkt sich möglicherweise auf Dienste aus, die auf niedrigeren Ebenen der Konfigurationshierarchie definiert sind, da sie eventuell diese Standardbindungen bzw. dieses Standardverhalten verwenden. Daher muss jede Person, die Standardbindungen und -verhalten ändert, berücksichtigen, dass sich diese Änderungen auf andere Dienste in der Hierarchie auswirken können.

Hinweis

Unter Internetinformationsdienste (IIS) oder dem Windows-Prozessaktivierungsdienst (WAS) gehostete Dienste verwenden das virtuelle Verzeichnis als Basisadresse.

<protocolMapping>
  <add scheme="http"     binding="basicHttpBinding" bindingConfiguration="MyBindingConfig"/>
  <add scheme="net.tcp"  binding="netTcpBinding"/>
  <add scheme="net.pipe" binding="netNamedPipeBinding"/>
  <add scheme="net.msmq" binding="netMSMQBinding"/>
</protocolMapping>

Im vorherigen Beispiel verwendet ein Endpunkt mit einer Basisadresse, die mit dem Schema "http" beginnt, das BasicHttpBinding-Objekt. Ein Endpunkt mit einer Basisadresse, die mit dem Schema "net.tcp" beginnt, verwendet das NetTcpBinding-Objekt. Sie können Einstellungen in einer lokalen App.config- oder Web.config-Datei überschreiben.

Jedes Element innerhalb des <protocolMappings>-Abschnitts muss ein Schema und eine Bindung angeben. Optional kann es ein bindingConfiguration-Attribut angeben, das eine Bindungskonfiguration im <bindings>-Abschnitt der Konfigurationsdatei angibt. Wenn keine bindingConfiguration angegeben wird, wird die anonyme Bindungskonfiguration des entsprechenden Bindungstyps verwendet.

Die Dienstverhaltensweisen werden für die Standardendpunkte konfiguriert, indem anonyme <behavior>-Abschnitte innerhalb von <serviceBehaviors>-Abschnitten verwendet werden. Alle unbenannten <behavior>-Elemente innerhalb von <serviceBehaviors> werden verwendet, um Dienstverhaltensweisen zu konfigurieren. Die folgende Konfigurationsdatei ermöglicht z. B. die Veröffentlichung von Dienstmetadaten für alle Dienste innerhalb des Hosts.

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>    <!-- No <service> tag is necessary. Default endpoints are added to the service -->
    <!-- The service behavior with name="" is picked up by the service -->
 </system.serviceModel>

Endpunktverhaltensweisen werden konfiguriert, indem anonyme <behavior>-Abschnitte innerhalb von <serviceBehaviors>-Abschnitten verwendet werden.

Das folgende Beispiel zeigt eine Konfigurationsdatei, die der Datei am Anfang dieses Themas ähnelt, in der das vereinfachte Konfigurationsmodell verwendet wird.

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
       <basicHttpBinding>
          <binding maxBufferSize="100"
                   maxReceiveBufferSize="100" />
       </basicHttpBinding>
    </bindings>
    <!-- No <service> tag is necessary. Default endpoints will be added to the service -->
    <!-- The service behavior with name="" will be picked up by the service -->
    <protocolMapping>
      <add scheme="http" binding="basicHttpBinding" />
  </protocolMapping>
  </system.serviceModel>

Wichtig

Diese Funktion ist nur für die WCF-Dienstkonfiguration, nicht für die Clientkonfiguration relevant. WCF-Clientkonfigurationen werden meistens von einem Tool, z. B. svcutil.exe, oder durch Hinzufügen eines Dienstverweises aus Visual Studio generiert. Wenn Sie einen WCF-Client manuell konfigurieren, müssen Sie der Konfiguration ein <client>-Element hinzufügen und alle Endpunkte angeben, die Sie aufrufen möchten.

Siehe auch