Windows Communication Foundation (WCF) 可讓開發人員使用設定檔或程式碼來設定服務。 當服務需要在部署後進行設定時,組態檔非常有用。 使用組態檔時,IT 專業人員只需更新組態檔,不必重新編譯。 但是組態檔可能會很複雜而難以維護。 由於不支援組態檔偵錯,而且組態項目是以名稱來參考,這使得製作組態檔容易出錯且難度增加。 WCF 也允許您以程式碼來設定服務。 在舊版 WCF (4.0 及更早版本) 的在自我裝載案例中,您可以輕鬆使用程式碼來設定服務,因為 ServiceHost 類別可讓您在呼叫 ServiceHost.Open 之前設定端點和行為。 但是在 Web 裝載案例中,您就無法直接存取 ServiceHost 類別。 為了設定 Web 裝載服務,您需要建立會建立 System.ServiceModel.ServiceHostFactory 的 ServiceHostFactory,並執行任何所需的設定。 從 .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 會忽略 <host> 的 <service> 標籤內的 <system.serviceModel> 設定。 在概念上,與 <host> 有關的是主機設定而不是服務設定,前者會在 Configure 方法執行之前載入。