Delen via


WCF-services configureren in code

Met Windows Communication Foundation (WCF) kunnen ontwikkelaars services configureren met behulp van configuratiebestanden of code. Configuratiebestanden zijn handig wanneer een service moet worden geconfigureerd nadat deze is geïmplementeerd. Wanneer u configuratiebestanden gebruikt, hoeft een IT-professional alleen het configuratiebestand bij te werken. Er is geen hercompilatie vereist. Configuratiebestanden kunnen echter complex en moeilijk te onderhouden zijn. Er is geen ondersteuning voor foutopsporing van configuratiebestanden en configuratie-elementen die verwijzen naar namen die het ontwerpen van configuratiebestanden foutgevoelig en moeilijk maken. Met WCF kunt u ook services in code configureren. In eerdere versies van WCF (4.0 en eerder) was het configureren van services in code eenvoudig in zelf-hostende scenario's, ServiceHost waardoor u eindpunten en gedrag kon configureren voordat u ServiceHost.Open aanroept. In gehoste webscenario's hebt u echter geen directe toegang tot de ServiceHost klasse. Als u een gehoste webservice wilt configureren, moest u een System.ServiceModel.ServiceHostFactory service maken die de ServiceHostFactory benodigde configuratie heeft gemaakt en uitgevoerd. Vanaf .NET Framework 4.5 biedt WCF een eenvoudigere manier om zowel zelf-hostende als web-gehoste services in code te configureren.

De methode Configureren

Definieer gewoon een openbare statische methode die wordt aangeroepen Configure met de volgende handtekening in uw service-implementatieklasse:

public static void Configure(ServiceConfiguration config)

De methode Configureren gebruikt een ServiceConfiguration exemplaar waarmee de ontwikkelaar eindpunten en gedrag kan toevoegen. Deze methode wordt aangeroepen door WCF voordat de servicehost wordt geopend. Wanneer dit is gedefinieerd, worden alle serviceconfiguratie-instellingen die zijn opgegeven in een app.config- of web.config-bestand genegeerd.

In het volgende codefragment ziet u hoe u de Configure methode definieert en een service-eindpunt, een eindpuntgedrag en servicegedrag toevoegt:

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

Als u een protocol zoals https voor een service wilt inschakelen, kunt u expliciet een eindpunt toevoegen dat gebruikmaakt van het protocol of u kunt automatisch eindpunten toevoegen door ServiceConfiguration.EnableProtocol(Binding) aan te roepen waarmee een eindpunt wordt toegevoegd voor elk basisadres dat compatibel is met het protocol en elk gedefinieerd servicecontract. De volgende code illustreert hoe u de methode ServiceConfiguration.EnableProtocol gebruikt:

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

De instellingen in de <protocolMappings> sectie worden alleen gebruikt als er geen toepassingseindpunten programmatisch aan de ServiceConfiguration sectie worden toegevoegd. U kunt de serviceconfiguratie desgewenst laden vanuit het standaardtoepassingsconfiguratiebestand door de instellingen aan te roepen LoadFromConfiguration en vervolgens te wijzigen. Met de LoadFromConfiguration() klasse kunt u ook configuratie laden vanuit een gecentraliseerde configuratie. De volgende code illustreert hoe u dit implementeert:

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));
    }
}

Belangrijk

Houd er rekening mee dat LoadFromConfiguration instellingen binnen de <service> tag van <system.serviceModel>.<host> Conceptueel gaat <host> het om hostconfiguratie, niet over serviceconfiguratie en wordt deze geladen voordat de methode Configureren wordt uitgevoerd.

Zie ook