菜菜從零學習WCF三(配置服務)


配置服務概述

  在設計和實現服務協定后,即可配置服務。在其中可以定義和自定義如何向客戶端公開服務,包括指定可以找到服務的地址、服務用於發送和接收消息的傳輸和消息編碼,以及服務需要的安全類型。

  配置服務的類型

    --使用配置文件配置

    --在代碼中強制配置

    實際上,編寫配置是WCF應用程序編程的主要部分。

  使用配置文件配置WCF服務

  --通過使用配置文件配置Windows Communication Foundation(WCF)服務,可提供在部署時而設計時提供終結點和服務行為數據的靈活性。

  --可使用.NET Framework配置技術對WCF服務進行配置。通常情況下,向承載WCF服務的Intrnet信息服務(IIS)網站的Web.config文件添加XML元素。通過這些元素,可以逐台計算機更改詳細信息,例如終結點地址(用於與服務進行通信的實際地址)。此外,WCF包括幾個系統提供的元素,可用於快速選擇服務的最基本的功能

  --WCF使用.NET Framework的System.Configuration配置系統

    1.使用IIS來承載服務-使用Web.config文件

    2.使用任何其他宿主環境-使用App.config文件指定設置。

  Service元素

  每個服務都具有以下屬性:

  --name,指定聽歌服務協定的實現的類型。這是完全限定名稱(命名空間和類型名稱)。

  --behaviorConfiguration.指定一個在behabiors元素中找到的behabior元素的名稱,指定的行為控制操作,例如服務是否允許模擬。

  endpoint元素

  每個終結點都需要以下屬性表示的地址、綁定和協定:

  --address.指定服務的統一資源標識符(URI),它可以是一個絕對地址,或是一個相對於服務基址給定的地址。如果設置為空字符串,則指示在創建服務的ServiceHost時,終結點在指定的基址上可用。

  --binding.通常,指定一個類似WsHttpBinding的系統提供的綁定,但也可以指定一個用戶定義的綁定,指定的綁定確定傳輸協議類型、安全和使用的編碼,以及是否支持或啟用可靠會話、事務或流。

  --bindingConfiguration。如果必須修改綁定的默認值,則可通過在bindings元素中配置相應的binding元素來執行此操作。次屬性應賦予與用於更改默認值的binding元素的name屬性相同的值。

  --contract.指定定義協定的接口。這是在由Service元素的name屬性指定的公共語言運行庫(CLR)類型中實現的接口。

配置綁定

  綁定是用於指定連接到Windows Communication Foundation(WCF)服務終結點所必需的通信詳細信息的對象。WCF服務中的每個終結點都要求正確指定綁定。

  綁定最起碼必須指定要使用的傳輸(如Http或TCP)。還可以通過綁定來設置其他特征,如安全和事務支持。

  綁定中的信息可能非常基本,也可能非常復雜。最基本的綁定僅指定必須用於連接到終結點的傳輸協議(如Http).一般來說,綁定包括的有關如何連接到終結點的信息屬於以下類別中的一種。

  --協議

    確定要是用的安全機制,可靠消息傳遞功能或事務上下文流設置。

  --編碼

    確定消息編碼(例如,文本或二進制)。

  --傳輸

    確定要使用的基礎傳輸協議(例如,TCP或HTTP)。

  綁定中的信息可能十分復雜,而且某些設置可能與其他設置不兼容。因此,WCF包含一組系統提供的綁定。這些綁定旨在滿足大多數應用程序要求。下面的類表示系統提供的綁定的一些示例:

  --BasicHttpBinding:一個HTTP協議綁定,適用於連接到復合WS-1既不能配置文件規范的Web服務(例如,基於ASP.NET Web服務的服務)。

  --WSHttpBinding:一個可互操作的綁定,適用於連接到復合WS_*協議的終結點。

  --NetNamePipeBinding:使用.NET.FrameWork連接到同一計算機上的其他WCF終結點。

  --NetMsmqBinding:使用.NET Framework創建與其他WCF終結點的排隊消息連接。

  使用自己的綁定

    --如果系統提供的綁定都不具有服務應用程序所需要的正確功能組合,則可以創建自己的綁定,有兩種方法可以實現此目的。

      --可以勇士CustomBinding對象從預先存在的綁定元素創建新的綁定

      --也可以通過從Binding綁定派生來創建完全由用戶定義的綁定

  使用綁定

    --使用綁定需要執行兩個基本步驟:

    --選擇和定義綁定.最簡單的方法就是選擇WCF包含的系統提供綁定中的一個,並且通過該綁定的默認設置來使用它。。

    --創建一個使用所選擇或定義的綁定的終結點。

  

主要就是在System.ServiceModel節點下的四個節點 Services  bindings  behaviors client

再來看一下bindings節點下的

接下來看behaviors節點下的

再來看一下client節點下的

最后我們來看一下Services節點下的

Services節點下可以有一個或多個Service節點。再來看一下Service節點下的

 

 

  最最后將總的配置文件全部載入

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <!-- <system.ServiceModel> section -->
    <system.ServiceModel>
        <!-- services 元素包含應用中駐留的所有service的配置要求 -->
        <services>
            <!-- 每個服務的配置
             屬性說明: 
             name - 指定這個service配置是針對的那個服務,為一個實現了某些Contract的服務類的完全限定名
                   (名稱空間.類型名),ServiceHost載入一個服務后,會到配置文件中的<services>下找有沒有
                   name屬性跟服務匹配的<service>的配置 
             behaviorConfiguration - 指定在<serviceBehaviors>下的一個<behavior>的name,這個特定<behavior>
                                     給這個service制定了一些行為,比如服務是否允許身份模擬-->
            <service name="名稱空間.類型名" behaviorConfiguration="behavior名">
                <!-- 每個服務可以有多個Endpoint,下面<endpoint>元素對每個Endpoint分別進行配置
                 屬性說明: 
                 address - 指定這個Endpoint對外的URI,這個URI可以是個絕對地址,也可以是個相對於baseAddress的
                           相對地址。如果此屬性為空,則這個Endpoint的地址就是baseAddress
                 binding - 指定這個Endpoint使用的binding,這個banding可以是系統預定義的9個binding之一,
                           比如是basicHttpBinding,也可以是自定義的customBinding。binding決定了通訊的類型、
                           安全、如何編碼、是否基於session、是否基於事務等等
                 contract - 指定這個Endpoint對應的Contract的全限定名(名稱空間.類型名),這個Contract應該被
                            service元素的name指定的那個service實現 
                 bindingConfiguration - 指定一個binding的配置名稱,跟<bindings>下面同類<binding>的name匹配
                 name - Endpoint的名稱,可選屬性,每個Contract都可以有多個Endpoint,但是每個Contract對應的
                        多個Endpoint名必須是唯一的-->
                <endpoint address="URI" binding="basicHttpBinding" contract="Contract全限定名" bindingConfiguration="binding名" name="">
                    <!-- 用戶定義的xml元素集合,一般用作SOAP的header內容-->
                    <headers>
                        <!-- 任何xml內容 -->
                    </headers>
                    <identity>
                        <!-- <identity>下的元素都是可選的-->
                        <userPrincipalName></userPrincipalName>
                        <servicePrincipalName></servicePrincipalName>
                        <dns></dns>
                        <rsa></rsa>
                        <certificate encodedValue=""></certificate>
                        <!-- <certificateReference>的屬性都是可選的
                         屬性說明:
                         storeName - 證書的存儲區,可能值為:AddressBook,AuthRoot,CertificateAuthority
                                     Disallowed,My,Root,TrustedPeople,TrustedPublisher
                         storeLocation - 證書存儲位置,可能值為:CurrentUser,LocalMachine-->
                        <certificateReference storeName="" storeLocation="">
                        </certificateReference>
                    </identity>
                </endpoint>
                <host>
                    <baseAddresses>
                        <!-- 在此可以定義每種傳輸協議的baseAddress,用於跟使用同樣傳輸協議Endpoint定義的相對地
                    址組成完整的地址,但是每種傳輸協議只能定義一個baseAddress。HTTP的baseAddress同時是service
                    對外發布元數據的URL-->
                        <add baseAddress="http://address" />
                    </baseAddresses>
                    <timeouts></timeouts>
                </host>
            </service>
        </services>
 <!-- 指定一個或多個系統預定義的binding -->
        <bindings>
            <!-- 指定一個或多個系統預定義的binding,比如<basicHttpBinding>,當然也可以指定自定義的customBinding,
             然后在某個指定的binding下建立一個或多個配置,以便被Endpoint來使用這些配置 -->
            <basicHttpBinding>
                <!-- 某一類的binding的下面可能有多個配置,binding元素的name屬性標識某個binding-->
                <binding name="binding名">
                </binding>
            </basicHttpBinding>
        </bindings>
        <!-- 定義service和Endpiont行為-->
        <behaviors>
            <!-- 定義service的行為-->
            <serviceBehaviors>
                <!-- 一個或多個系統提供的或定制的behavior元素
                 屬性說明:
                 name - 一個behavior唯一標識,<service>元素的behaviorConfiguration屬性指向這個name-->
                <behavior name="">
                    <!-- 指定service元數據發布和相關信息
                     屬性說明:
                     httpGetEnabled - bool類型的值,表示是否允許通過HTTP的get方法獲取sevice的WSDL元數據
                     httpGetUrl - 如果httpGetEnabled為true,這個屬性指示使用哪個URL地址發布服務的WSDL,
                                  如果這個屬性沒有設置,則使用服務的HTTP類型的baseAddress后面加上?WSDL-->
                    <serviceMetadata httpGetEnabled="true" httpGetUrl="http://URI:port/address" />
                </behavior>
            </serviceBehaviors>
            <!-- 定義Endpiont的行為-->
            <endpointBehaviors>
            </endpointBehaviors>
        </behaviors>
        <!-- 包含客戶端跟服務端連接使用到的Endpoint的配置 -->
        <client>
            <!-- 每個客戶端Endpoint設置
             屬性說明:
             address - 對應到服務端這個Endpoint的address
             binding - 指定這個Endpoint使用的binding,這個banding可以是系統預定義的9個binding之一,
                       比如是basicHttpBinding
             contract - 指定這個Endpoint對應的Contract的全限定名(名稱空間.類型名)
             name - Endpoint的配置名,客戶端代理類的構造方法中的endpointConfigurationName對應到這個name
             bindingConfiguration - 指定客戶端binding的具體設置,指向<bindings>元素下同類型binding的name -->
            <endpoint address="URI"
                binding="basicHttpBinding" bindingConfiguration="binding名"
                contract="Contract全限定名" name="endpoint配置名" />
        </client>
    </system.ServiceModel>
</configuration>

 

 

 

配置終結點


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM