Konfigurowanie usług WCF w kodzie

Program Windows Communication Foundation (WCF) umożliwia deweloperom konfigurowanie usług przy użyciu plików konfiguracji lub kodu. Pliki konfiguracji są przydatne, gdy po wdrożeniu należy skonfigurować usługę. W przypadku korzystania z plików konfiguracji specjalista IT musi tylko zaktualizować plik konfiguracji, nie jest wymagana ponowna kompilacja. Jednak pliki konfiguracji mogą być złożone i trudne do utrzymania. Nie ma obsługi debugowania plików konfiguracji i elementów konfiguracji są przywoływania przez nazwy, co sprawia, że tworzenie plików konfiguracji jest podatne na błędy i trudne. Program WCF umożliwia również konfigurowanie usług w kodzie. We wcześniejszych wersjach programu WCF (4.0 i starszych) konfigurowanie usług w kodzie było łatwe w scenariuszach hostowanych samodzielnie, ServiceHost klasa umożliwiała konfigurowanie punktów końcowych i zachowań przed wywołaniem elementu ServiceHost.Open. Jednak w scenariuszach hostowanych w internecie nie masz bezpośredniego dostępu do ServiceHost klasy. Aby skonfigurować usługę hostowaną w internecie, musisz utworzyć usługę, która System.ServiceModel.ServiceHostFactory utworzyła ServiceHostFactory i wykonała wymaganą konfigurację. Począwszy od programu .NET Framework 4.5, program WCF zapewnia łatwiejszy sposób konfigurowania zarówno usług hostowanych samodzielnie, jak i hostowanych w internecie w kodzie.

Metoda Configure

Wystarczy zdefiniować publiczną metodę statyczną o nazwie Configure z następującym podpisem w klasie implementacji usługi:

public static void Configure(ServiceConfiguration config)

Metoda Configure przyjmuje ServiceConfiguration wystąpienie, które umożliwia deweloperowi dodawanie punktów końcowych i zachowań. Ta metoda jest wywoływana przez usługę WCF przed otwarciem hosta usługi. Po zdefiniowaniu wszystkie ustawienia konfiguracji usługi określone w pliku app.config lub web.config będą ignorowane.

Poniższy fragment kodu ilustruje sposób definiowania Configure metody i dodawania punktu końcowego usługi, zachowania punktu końcowego i zachowania usługi:

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

Aby włączyć protokół, taki jak https dla usługi, można jawnie dodać punkt końcowy używający protokołu lub automatycznie dodać punkty końcowe, wywołując metodę ServiceConfiguration.EnableProtocol(Binding), która dodaje punkt końcowy dla każdego adresu podstawowego zgodnego z protokołem i każdą zdefiniowaną umową usługi. Poniższy kod ilustruje sposób użycia 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");
    }
}

Ustawienia w <protocolMappings> sekcji są używane tylko wtedy, gdy żadne punkty końcowe aplikacji nie zostaną dodane ServiceConfiguration programowo. Opcjonalnie możesz załadować konfigurację usługi z domyślnego pliku konfiguracji aplikacji, wywołując polecenie LoadFromConfiguration , a następnie zmieniając ustawienia. Klasa LoadFromConfiguration() umożliwia również ładowanie konfiguracji ze scentralizowanej konfiguracji. Poniższy kod ilustruje sposób implementacji tego:

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

Ważne

Pamiętaj, że LoadFromConfiguration ignoruje><hostustawienia w tagu .<service><system.serviceModel> Koncepcyjnie chodzi <host> o konfigurację hosta, a nie konfigurację usługi i jest ładowana przed wykonaniem metody Configure.

Zobacz też