WCF-szolgáltatások konfigurálása a Kódban

A Windows Communication Foundation (WCF) lehetővé teszi a fejlesztők számára, hogy konfigurációs fájlok vagy kódok használatával konfigurálják a szolgáltatásokat. A konfigurációs fájlok akkor hasznosak, ha a szolgáltatást az üzembe helyezés után konfigurálni kell. Konfigurációs fájlok használatakor egy informatikai szakembernek csak frissítenie kell a konfigurációs fájlt, nincs szükség újrafordításra. A konfigurációs fájlok azonban összetettek és nehezen karbantarthatók. A konfigurációs fájlok hibakeresése nem támogatott, és a konfigurációs elemekre olyan nevek hivatkoznak, amelyek hibalehetőséget és nehézséget okoznak a konfigurációs fájlok készítésében. A WCF lehetővé teszi a szolgáltatások kódban való konfigurálását is. A WCF korábbi (4.0-s és korábbi) verzióiban a szolgáltatások kódban való konfigurálása egyszerű volt a saját üzemeltetésű forgatókönyvekben, az ServiceHost osztály lehetővé tette végpontok és viselkedések konfigurálását a ServiceHost.Open meghívása előtt. A webes üzemeltetésű forgatókönyvekben azonban nem rendelkezik közvetlen hozzáféréssel az ServiceHost osztályhoz. A webszolgáltatás konfigurálásához létre kellett hoznia egy System.ServiceModel.ServiceHostFactory, amely létrehozta a ServiceHostFactory-t, és elvégezte a szükséges konfigurációt. A .NET-KERETRENDSZER 4.5-től kezdve a WCF egyszerűbb módot kínál a saját üzemeltetésű és a webes szolgáltatások kódban való konfigurálására.

A Konfigurálás metódus

Egyszerűen definiáljon egy nyilvános statikus metódust Configure névvel és a következő szignatúrával a szolgáltatás implementálási osztályában:

public static void Configure(ServiceConfiguration config)

A Konfigurálás metódus olyan példányt ServiceConfiguration használ, amely lehetővé teszi a fejlesztő számára végpontok és viselkedések hozzáadását. Ezt a metódust a WCF hívja meg a szolgáltatásgazda megnyitása előtt. Ha meg van adva, a rendszer figyelmen kívül hagyja az app.config vagy web.config fájlban megadott szolgáltatáskonfigurációs beállításokat.

Az alábbi kódrészlet bemutatja, hogyan definiálhatja a Configure metódust, és hogyan adhat hozzá szolgáltatásvégpontot, végponti viselkedést és szolgáltatásviselkedést:

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

Ha engedélyezni szeretne egy olyan protokollt, mint például a https egy szolgáltatáshoz, explicit módon hozzáadhat egy végpontot, amely a protokollt használja, vagy automatikusan hozzáadhat végpontokat a ServiceConfiguration.EnableProtocol(Binding) meghívásával, amely végpontot ad hozzá a protokollal kompatibilis minden alapcímhez és minden meghatározott szolgáltatási szerződéshez. Az alábbi kód a ServiceConfiguration.EnableProtocol metódus használatát mutatja be:

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

A <protocolMappings> szakasz beállításai csak akkor használatosak, ha programozott módon nem adnak hozzá ServiceConfiguration alkalmazásvégpontokat. A szolgáltatás konfigurációját igénybe vehetik az alapértelmezett alkalmazáskonfigurációs fájlból a LoadFromConfiguration hívással, majd módosíthatja a beállításokat. Az LoadFromConfiguration() osztály lehetővé teszi a konfiguráció központosított konfigurációból való betöltését is. Az alábbi kód bemutatja, hogyan implementálhatja ezt:

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

Fontos

Vegye figyelembe, hogy LoadFromConfiguration figyelmen kívül hagyja <host> a beállításokat a <service> címke alatt <system.serviceModel>. Elméletileg, <host> a gazdagép konfigurációjáról szól, nem a szolgáltatás konfigurációjáról, és még azelőtt betöltődik, hogy a Konfigurálás metódust végrehajtanák.

Lásd még