Konfigurieren von WCF-Diensten in Code

Windows Communication Foundation (WCF) ermöglicht Entwicklerinnen und Entwicklern das Konfigurieren von Diensten mithilfe von Konfigurationsdateien oder Code. Konfigurationsdateien sind nützlich, wenn ein Dienst konfiguriert werden muss, nachdem er bereitgestellt wurde. Bei der Verwendung von Konfigurationsdateien muss ein IT-Experte nur die Konfigurationsdatei aktualisieren, es ist keine Neukompilierung erforderlich. Konfigurationsdateien können jedoch komplex und schwierig zu pflegen sein. Das Debuggen von Konfigurationsdateien wird nicht unterstützt. Auf Konfigurationselemente wird über den Namen verwiesen, was die Erstellung von Konfigurationsdateien fehleranfällig und schwierig macht. WCF ermöglicht auch das Konfigurieren von Diensten im Code. In früheren Versionen von WCF (4.0 und früher) war das Konfigurieren von Diensten im Code in selbstgehosteten Szenarien einfach, weil die ServiceHost-Klasse die Möglichkeit bot, Endpunkte und Verhaltensweisen vor dem Aufrufen von ServiceHost.Open zu konfigurieren. In webgehosteten Szenarien haben Sie jedoch keinen direkten Zugriff auf die ServiceHost-Klasse. Um einen webgehosteten Dienst zu konfigurieren, mussten Sie eine System.ServiceModel.ServiceHostFactory erstellen, durch die ein ServiceHostFactory erstellt und alle erforderlichen Konfigurationsschritte ausgeführt wurden. Ab .NET Framework 4.5 bietet WCF eine einfachere Möglichkeit, selbstgehostete und webgehostete Dienste im Code zu konfigurieren.

Die Configure-Methode

Definieren Sie einfach in der Dienstimplementierungsklasse die öffentliche statische Methode Configure mit der folgenden Signatur:

public static void Configure(ServiceConfiguration config)

Die Configure-Methode akzeptiert eine ServiceConfiguration-Instanz, die es den Entwicklern ermöglicht, Endpunkte und Verhalten hinzuzufügen. Diese Methode wird von WCF aufgerufen, bevor der Diensthost geöffnet wird. Sofern definiert, werden alle Dienstkonfigurationseinstellungen in der Datei app.config oder web.config ignoriert.

Der folgende Codeausschnitt zeigt, wie die Configure-Methode definiert wird und ein Dienstendpunkt, ein Endpunktverhalten und Dienstverhalten hinzugefügt werden:

public class Service1 : IService1
    {
        public static void Configure(ServiceConfiguration config)
        {
            ServiceEndpoint se = new ServiceEndpoint(new ContractDescription("IService1"), new BasicHttpBinding(), new EndpointAddress("basic"));
            se.Behaviors.Add(new MyEndpointBehavior());
            config.AddServiceEndpoint(se);

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

        public string GetData(int value)
        {
            return $"You entered: {value}";
        }

        public CompositeType GetDataUsingDataContract(CompositeType composite)
        {
            if (composite == null)
            {
                throw new ArgumentNullException("composite");
            }
            if (composite.BoolValue)
            {
                composite.StringValue += "Suffix";
            }
            return composite;
        }
    }

Um ein Protokoll, z. B. HTTPS, für einen Dienst zu aktivieren, können Sie entweder explizit einen Endpunkt hinzufügen, der das Protokoll verwendet, oder Sie können automatisch Endpunkte durch Aufrufen von ServiceConfiguration.EnableProtocol(Binding) hinzufügen. Dabei wird ein Endpunkt für jede Basisadresse, die mit dem Protokoll kompatibel ist, und für jeden definierten Dienstvertrag hinzugefügt. Der folgende Code veranschaulicht die Verwendung der ServiceConfiguration.EnableProtocol-Methode:

public class Service1 : IService1
{
    public string GetData(int value);
    public static void Configure(ServiceConfiguration config)
    {
        // Enable "Add Service Reference" support
       config.Description.Behaviors.Add( new ServiceMetadataBehavior { HttpGetEnabled = true });
       // set up support for http, https, net.tcp, net.pipe
       config.EnableProtocol(new BasicHttpBinding());
       config.EnableProtocol(new BasicHttpsBinding());
       config.EnableProtocol(new NetTcpBinding());
       config.EnableProtocol(new NetNamedPipeBinding());
       // add an extra BasicHttpBinding endpoint at http:///basic
       config.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(),"basic");
    }
}

Die Einstellungen im Abschnitt <protocolMappings> werden nur verwendet, wenn ServiceConfiguration keine Anwendungsendpunkte programmgesteuert hinzugefügt werden. Optional können Sie die Dienstkonfiguration aus der Standardanwendungskonfigurationsdatei laden, indem Sie LoadFromConfiguration aufrufen und dann die Einstellungen ändern. Sie können auch mit der LoadFromConfiguration()-Klasse die Konfiguration aus einer zentralen Konfiguration laden. Im folgenden Code wird veranschaulicht, wie dies implementiert wird:

public class Service1 : IService1
{
    public void DoWork();
    public static void Configure(ServiceConfiguration config)
    {
          config.LoadFromConfiguration(ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = @"c:\sharedConfig\MyConfig.config" }, ConfigurationUserLevel.None));
    }
}

Wichtig

Beachten Sie, dass LoadFromConfiguration<host>-Einstellungen innerhalb des <service>-Tags von <system.serviceModel> ignoriert. Im Prinzip bezieht sich <host> auf die Hostkonfiguration, nicht auf die Dienstkonfiguration, und wird geladen, bevor die Configure-Methode ausgeführt wird.

Siehe auch