Sdílet prostřednictvím


Konfigurace služeb WCF v kódu

Windows Communication Foundation (WCF) umožňuje vývojářům konfigurovat služby pomocí konfiguračních souborů nebo kódu. Konfigurační soubory jsou užitečné, když je potřeba nakonfigurovat službu po nasazení. Při použití konfiguračních souborů potřebuje IT specialista pouze aktualizovat konfigurační soubor, nevyžaduje se žádná rekompilace. Konfigurační soubory ale můžou být složité a obtížně udržovatelné. Na konfigurační soubory a elementy konfigurace ladění se odkazují názvy, které vytváření konfiguračních souborů znesnadňuje a ztěžuje. WCF také umožňuje konfigurovat služby v kódu. Ve starších verzích WCF (4.0 a starších) konfigurace služeb v kódu byla snadná ve scénářích v místním prostředí, ServiceHost třída vám umožnila konfigurovat koncové body a chování před voláním ServiceHost.Open. Ve scénářích hostovaných na webu ale nemáte přímý přístup ke ServiceHost třídě. Pokud chcete nakonfigurovat službu hostované na webu, museli jste vytvořit System.ServiceModel.ServiceHostFactory vytvořenou ServiceHostFactory službu, kterou jste provedli a provedli jakoukoli potřebnou konfiguraci. Od rozhraní .NET Framework 4.5 poskytuje WCF jednodušší způsob, jak nakonfigurovat služby hostované v kódu i služby hostované na webu.

Metoda Configure

Jednoduše definujte veřejnou statickou metodu s Configure následujícím podpisem ve třídě implementace služby:

public static void Configure(ServiceConfiguration config)

Metoda Configure přebírá ServiceConfiguration instanci, která vývojáři umožňuje přidávat koncové body a chování. Tato metoda je volána WCF před otevřením hostitele služby. Při definování budou všechna nastavení konfigurace služby zadaná v souboru app.config nebo web.config ignorována.

Následující fragment kódu ukazuje, jak definovat metodu Configure a přidat koncový bod služby, chování koncového bodu a chování služby:

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

Pokud chcete povolit protokol, jako je https pro službu, můžete buď explicitně přidat koncový bod, který protokol používá, nebo můžete automaticky přidat koncové body voláním ServiceConfiguration.EnableProtocol(Binding), který přidá koncový bod pro každou základní adresu kompatibilní s protokolem a každým definovaným kontraktem služby. Následující kód ilustruje použití metody ServiceConfiguration.EnableProtocol:

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

Nastavení v oddílu <protocolMappings> se používají jenom v případě, že do ServiceConfiguration kódu programu nejsou přidány žádné koncové body aplikace. Volitelně můžete konfiguraci služby načíst z výchozího konfiguračního souboru aplikace voláním LoadFromConfiguration a změnou nastavení. Třída LoadFromConfiguration() také umožňuje načíst konfiguraci z centralizované konfigurace. Následující kód ukazuje, jak tento kód implementovat:

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

Důležité

Všimněte si, že LoadFromConfiguration ignoruje <host> nastavení v rámci <service> značky <system.serviceModel>. Koncepčně <host> se jedná o konfiguraci hostitele, nikoli o konfiguraci služby a načte se před spuštěním metody Configure.

Viz také