Tipps und Tricks rund um .NET und Visual Studio

Vereinfachte Codekonfiguration in WCF 4.5
Kommentare

Dr. Holger Schwichtenberg (MVP) und FH-Prof. Manfred Steyer teilen in der Kolumne „.NETversum“ ihr Expertenwissen rund um .NET-Tools und WPF mit.

WCF erlaubt seit seinen ersten Tagen die Konfiguration von Services sowohl über Konfigurationsdateien als auch über Quellcode. Während ersteres das Modifizieren von Einstellungen nach dem Kompilieren ermöglicht, können bei letzterer Variante auch Konstrukte, für die keine Konfigurationselemente zur Verfügung stehen, genutzt werden. Beispiele hierfür sind unter anderem benutzerdefinierte Behaviors sowie Konfigurationsoptionen aus dem Lieferumfang von WCF, für die schlicht und ergreifend keine Unterstützung für die Konfiguration über Konfigurationsdateien vorgesehen ist.

Während das Konfigurieren mittels Code in Self-Hosting-Szenarien einfach ist, brachte es bis dato in Fällen, die IIS als Servicehost verwenden, Mehraufwand mit sich, zumal eine benutzerdefinierte ServiceHostFactory bereitgestellt werden musste oder andere Erweiterungsmöglichkeiten von WCF programmatisch zu bedienen waren.

Dieser Punkt wurde mit Version 4.5 erheblich vereinfacht. Um einen Service programmatisch zu konfigurieren, ist ihm lediglich eine statische Methode mit dem Namen Configure, die eine ServiceConfiguration entgegennimmt und keine Ergebnisse retour liefert, bereitzustellen. Innerhalb dieser Methode können die gewünschten Konfigurationseinstellungen der ServiceConfigurationInstanz bekanntgegeben werden. Ein Beispiel dafür findet sich im nachfolgenden Listing. Es registriert einen Endpunkt, der sich auf den Servicevertrag IFlugService und einem WsHttpBinding abstützt, und anschließend zwei Behaviors konfiguriert. Bei diesem Beispiel gilt zu beachten, dass eventuelle Einträge in der Konfigurationsdatei ignoriert werden (Listing 1).

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.IO;
using System.ServiceModel.Description;
using System.Configuration;
using System.Web;

namespace CodeConfigurationSample
{

  public class FlugService : IFlugService
  {

    public static void Configure(ServiceConfiguration config)
    {
        config.AddServiceEndpoint(
                   typeof(IFlugService), new WSHttpBinding(), "");

        config.Description.Behaviors.Add(
            new ServiceMetadataBehavior
            {
                HttpGetEnabled = true
            });

        config.Description.Behaviors.Add(
            new ServiceDebugBehavior
            {
                IncludeExceptionDetailInFaults = true
            });
    }

    public void BucheFlug(string flugNummer, 
                  DateTime datum, string vorname, string nachname)
    {
        [...]
    }
  }
}

Sollen die Einträge in der Konfigurationsdatei lediglich um die programmatisch festgelegten Aspekte erweitert werden, muss diese am Beginn von Configure geladen werden. Listing 2 demonstriert dies. Zunächst ermittelt es über die aktuelle AppDomain den vollständigen Namen der Konfigurationsdatei. Anschließend lädt das betrachtete Beispiel sie unter Einsatz des ConfigurationManagers und übergibt ihren Inhalt an die Methode LoadFromConfiguration der ServiceConfiguration (Listing 2).

public static void Configure2(ServiceConfiguration config)
{
  var configFile = 
    AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

  config.LoadFromConfiguration(
    ConfigurationManager.OpenMappedExeConfiguration(
      new ExeConfigurationFileMap
      {
        ExeConfigFilename = configFile
      },
    ConfigurationUserLevel.None));

  config.AddServiceEndpoint(typeof(IFlugService), new WSHttpBinding(), "");

}

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -