.NET 4.0中WCF服務配置的簡化與改進
原創(chuàng)【51CTO精選譯文】目前WCF用戶最頭痛的一件事就是需要為WCF服務處理眾多的配置文件,WCF配置模式本身非常復雜,為用戶操作增加了不少難度。在.Net 4中我們將為WCF用戶干一件實事,簡化WCF服務配置,為此我們將會在.Net 4中發(fā)布一系列新的WCF特性。
***個特性是不再需要為每個服務進行單獨的配置,如果你沒有為你的服務定義過任何< service>服務元素,你的服務也沒有通過編程定義任何端點,那么將會自動向你的服務中添加一套端點,每個服務一個,每個服務執(zhí)行的契約一個,這些端點的地址與基地址對應,綁定將由基地址模式和服務執(zhí)行的契約決定。
下面的配置就是傳統(tǒng)的WCF開發(fā)人員要編輯的WCF服務配置文件片段,在這個例子中,我們看到有一個基地址,執(zhí)行了一個契約:
- < ?xml version="1.0" encoding="utf-8" ?>
- < configuration>
- < system.serviceModel>
- < services>
- < service name="Service1">
- < host>
- < baseAddresses>
- < add baseAddress="http://localhost:8731/Service1/" />
- < /baseAddresses>
- < /host>
- < endpoint address=""
- binding="basicHttpBinding"
- contract="Library1.IService1" />
- < /service>
- < /services>
- < /system.serviceModel>
- < /configuration>
但在.Net 4中,這個配置就被簡化成:
- < ?xml version="1.0" encoding="utf-8" ?>
- < configuration>
- < /configuration>
在這種情況下,即使沒有配置文件,你也可以部署你的服務。在基地址模式和綁定類型之間也可以自定義映射,如果你想增強服務的安全性,可以為HTTP地址使用wsHttpBinding作為默認綁定類型,如:
- < protocolMapping>
- < add scheme="http" binding="wsHttpBinding" />
- < /protocolMapping>
第二個特性是允許用戶為WCF綁定和行為定義默認值,那些沒有名字的綁定、服務行為和端點行為可以應用到你沒有進行明確配置的服務中,如果在VS2008/.NET 3.5中查看某個WCF服務庫項目的配置,我們會看到:
- < ?xml version="1.0" encoding="utf-8" ?>
- < configuration>
- < system.serviceModel>
- < services>
- < service name="Service1"
- behaviorConfiguration="Service1Behavior">
- < host>
- < baseAddresses>
- < add baseAddress="http://localhost:8731/Service1/" />
- < /baseAddresses>
- < /host>
- < endpoint address=""
- binding="wsHttpBinding"
- contract="Library1.IService1" />
- < /service>
- < /services>
- < behaviors>
- < serviceBehaviors>
- < behavior name="Service1Behavior">
- < serviceMetadata httpGetEnabled="True" />
- < serviceDebug includeExceptionDetailInFaults="False" />
- < /behavior>
- < /serviceBehaviors>
- < /behaviors>
- < /system.serviceModel>
- < /configuration>
在.Net 4中新的WCF服務配置允許我們大大簡化服務配置,如:
- < ?xml version="1.0" encoding="utf-8" ?>
- < configuration>
- < system.serviceModel>
- < behaviors>
- < serviceBehaviors>
- < behavior>
- < serviceMetadata httpGetEnabled="True" />
- < serviceDebug includeExceptionDetailInFaults="False" />
- < /behavior>
- < /serviceBehaviors>
- < /behaviors>
- < /system.serviceModel>
- < /configuration>
實際上,這恰好顯示了VS2010/.NET 4中新的服務配置模板的模樣。
定義默認的綁定和行為在.Net 4 WCF服務配置繼承中非常有用,那些在配置層次***定義的綁定和行為將會自動添加到你的服務中,這就是傳說中的配置繼承。下圖顯示了如何依賴于機器和應用程序級定義的配置元素來簡化你的服務配置。
在這個例子中,默認的basicHttpBinding和serviceMetadataBehavior都定義在物理層,在下一級定義了默認的serviceDebugBehavior,它將會添加服務上,只需默認端點使用了機器層定義的綁定即可。***要說明的是,.Net 4 Beta 2中這些默認服務行為將會被合并,并添加到那些沒有明確配置的服務上,敬請期待!
***,.Net 4中第三個WCF配置增強是標準端點,它允許你定義可重復使用的預配置端點,這些端點的主要特性是有一到多個地址、綁定和有固定值的契約屬性,這對于定義系統(tǒng)端點特別有用,系統(tǒng)端點提供它們自己的契約實施,例如不在你的服務中定義,作為MEX端點的實例,WCF開箱即可提供這個實現(xiàn)。標準端點的另一個有趣的特性是可以使用新的屬性擴展服務端點,也可以使用類似的方式自定義綁定。標準端點也允許你為你的服務端點定義自定義屬性。
為了定義標準端點,需要在你的端點中使用下面的屬性。***個屬性是kind,它標識了標準端點的類型,必須注冊到< endpointExtensions>小節(jié)中,第二個屬性是endpointConfiguration,它將去匹配< standardEndpoints>小節(jié)中標準端點的配置元素名,用于為端點定義新的屬性,***一個屬性是isSystemEndpoint,它標記端點確定它是否有一個固定的契約。
下面的配置代碼片段定義了一個udpDiscoveryEndpoint,它是一個不明確的契約,為端點定義了額外的屬性:
- < ?xml version="1.0" encoding="utf-8" ?>
- < configuration>
- < system.serviceModel>
- < services>
- < service name="Service1">
- < endpoint address=""
- binding="basicHttpBinding"
- contract="Library1.IService1" />
- < endpoint kind="udpDiscoveryEndpoint"
- endpointConfiguration="udpConfig" />
- < /service>
- < /services>
- < standardEndpoints>
- < udpDiscoveryEndpoint>
- < standardEndpoint
- name="udpConfig"
- multicastAddress="soap.udp://239.255.255.250:3703"
- ... />
- < /udpDiscoveryEndpoint>
- < /standardEndpoints>
- < /system.serviceModel>
- < /configuration>
- < endpointExtensions>
小節(jié)將會在machine.config中具體指定:
- < ?xml version="1.0" encoding="utf-8" ?>
- < configuration>
接下來會怎樣?
這些特性將幫助你維護一個清爽的WCF服務配置。不過還沒結束!有時你可能想要為你的服務定義不同的配置,例如一個用于調試,一個用于部署,在這種情況下,你仍然要維護web.config文件。我們目前已經可以在定義的配置文件上工作,它將擔任不同配置元素的元包,通過服務使用這個配置文件將它們導入進來。
原文:Service Configuration Improvements in .NET 4
作者:Amadeo Casas Cuadrado
【編輯推薦】