Dela via


Konfigurera WCF-tjänster i Kod

Med Windows Communication Foundation (WCF) kan utvecklare konfigurera tjänster med hjälp av konfigurationsfiler eller kod. Konfigurationsfiler är användbara när en tjänst måste konfigureras när den har distribuerats. När du använder konfigurationsfiler behöver it-tekniker bara uppdatera konfigurationsfilen, ingen omkompilering krävs. Konfigurationsfiler kan dock vara komplexa och svåra att underhålla. Det finns inget stöd för felsökning av konfigurationsfiler och konfigurationselement refereras till av namn som gör redigering av konfigurationsfiler felbenägna och svåra. Med WCF kan du också konfigurera tjänster i kod. I tidigare versioner av WCF (4.0 och tidigare) var det enkelt att konfigurera tjänster i kod i scenarier med egen värd, ServiceHost klassen tillät dig att konfigurera slutpunkter och beteenden innan du anropade ServiceHost.Open. I scenarier med webbvärdar har du dock inte direkt åtkomst till ServiceHost klassen. För att konfigurera en värdbaserad webbtjänst var du tvungen att skapa en System.ServiceModel.ServiceHostFactory som skapade ServiceHostFactory och utförde alla nödvändiga konfigurationer. Från och med .NET Framework 4.5 är WCF ett enklare sätt att konfigurera både lokalt installerade och webbaserade tjänster i kod.

Metoden Konfigurera

Definiera bara en offentlig statisk metod med Configure namnet med följande signatur i din tjänstimplementeringsklass:

public static void Configure(ServiceConfiguration config)

Metoden Konfigurera tar en ServiceConfiguration instans som gör det möjligt för utvecklaren att lägga till slutpunkter och beteenden. Den här metoden anropas av WCF innan tjänstvärden öppnas. När de definieras ignoreras alla tjänstkonfigurationsinställningar som anges i en app.config- eller web.config-fil.

Följande kodfragment visar hur du definierar Configure metoden och lägger till en tjänstslutpunkt, ett slutpunktsbeteende och tjänstbeteenden:

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

Om du vill aktivera ett protokoll som https för en tjänst kan du antingen uttryckligen lägga till en slutpunkt som använder protokollet eller så kan du automatiskt lägga till slutpunkter genom att anropa ServiceConfiguration.EnableProtocol(Binding) som lägger till en slutpunkt för varje basadress som är kompatibel med protokollet och varje definierat tjänstkontrakt. Följande kod visar hur du använder metoden 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");
    }
}

Inställningarna i <protocolMappings> avsnittet används endast om inga programslutpunkter läggs till ServiceConfiguration programmatiskt. Du kan också läsa in tjänstkonfigurationen från standardprogrammets konfigurationsfil genom att anropa LoadFromConfiguration och sedan ändra inställningarna. Med LoadFromConfiguration() klassen kan du också läsa in konfigurationen från en centraliserad konfiguration. Följande kod illustrerar hur du implementerar detta:

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

Viktigt!

Observera att LoadFromConfiguration ignorerar <host> inställningar i taggen <service> <system.serviceModel>i . Konceptuellt <host> handlar det om värdkonfiguration, inte tjänstkonfiguration, och det läses in innan metoden Konfigurera körs.

Se även