Sie sind hier: Weblog

Vereinfachte Code-Konfiguration in WCF ab .NET 4.5

Foto ,
25.08.2012 00:12:00

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 Service-Host 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, welche eine ServiceConfiguration entgegennimmt und keine Ergebnisse retourliefert, bereitzustellen. Innerhalb dieser Methode können die gewünschten Konfigurationseinstellungen der ServiceConfiguration-Instanz bekanntgegeben werden. Ein Beispiel dafür findet sich nachfolgend. Es registriert einen Endpunkt, welcher sich auf den Servicevertrag IFlugService und einem WsHttpBinding abstützt und konfiguriert anschließend zwei Behaviors. Bei diesem Beispiel gilt zu beachten, dass eventuelle Einträge in der Konfigurationsdatei ignoriert werden.

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. Das nächste Listing demonstriert dies. Zunächst ermittelt es über die aktuelle AppDomain den vollständigen Namen der Konfigurationsdatei. Anschließend lädt das betrachtete Beispiel diese unter Einsatz des ConfigurationManagers und übergibt ihren Inhalt an die Methode LoadFromConfiguration der ServiceConfiguration.

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(), "");
             
}