分享方式:


在程式碼中設定 WCF 服務

Windows Communication Foundation (WCF) 可讓開發人員使用設定檔或程式碼來設定服務。 當服務需要在部署後進行設定時,組態檔非常有用。 使用組態檔時,IT 專業人員只需更新組態檔,不必重新編譯。 但是組態檔可能會很複雜而難以維護。 由於不支援組態檔偵錯,而且組態項目是以名稱來參考,這使得製作組態檔容易出錯且難度增加。 WCF 也允許您以程式碼來設定服務。 在舊版 WCF (4.0 及更早版本) 的在自我裝載案例中,您可以輕鬆使用程式碼來設定服務,因為 ServiceHost 類別可讓您在呼叫 ServiceHost.Open 之前設定端點和行為。 但是在 Web 裝載案例中,您就無法直接存取 ServiceHost 類別。 為了設定 Web 裝載服務,您需要建立會建立 System.ServiceModel.ServiceHostFactoryServiceHostFactory,並執行任何所需的設定。 從 .NET Framework 4.5 開始,WCF 提供了更簡單的方法,以程式碼來設定自我裝載和 Web 裝載服務。

Configure 方法

只需定義名為 Configure 的公用靜態方法,並在您的服務實作類別中包含下列簽章:

public static void Configure(ServiceConfiguration config)

Configure 方法接受可讓開發人員加入端點和行為的 ServiceConfiguration 執行個體。 WCF 會在服務主機開啟之前呼叫這個方法。 一旦定義之後,將會忽略 app.config 或 web.config 檔案中指定的任何服務組態設定。

下列程式碼片段說明如何定義 Configure 方法,以及加入服務端點、端點行為和服務行為:

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

若要為服務啟用通訊協定 (例如 https),您可以明確加入使用該通訊協定的端點,或是呼叫 ServiceConfiguration.EnableProtocol(Binding) 以自動加入端點,也就是自動為每個與通訊協定相容的基底位址 (Base Address) 及所定義的每份服務合約加入端點。 下列程式碼示範如何使用 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");
    }
}

<protocolMappings> 區段中的設定只有在未以程式設計方式將任何應用程式端點加入至 ServiceConfiguration 時才會使用。您可以選擇呼叫 LoadFromConfiguration 從預設應用程式設定檔載入服務設定,然後變更設定。 LoadFromConfiguration() 類別也允許您從集中式組態載入組態。 下列程式碼說明如何實作此作業:

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

重要

請注意,LoadFromConfiguration 會忽略 <system.serviceModel> 的 <service> 標籤內的 <host> 設定。 在概念上,與 <host> 有關的是主機設定而不是服務設定,前者會在 Configure 方法執行之前載入。

另請參閱