匯出 (0) 列印
全部展開

作法:透過程式設計方式設定服務匯流排服務

更新日期: 2014年6月

在您使用程式碼定義和實作 服務匯流排 服務的介面之後,就可以開始設定應用程式。 請注意,設定 服務匯流排 應用程式與設定 Windows Communication Foundation (WCF) 應用程式 (如 WCF 文件中的Configuring Services所述) 十分類似。 因此,此主題包含設定 服務匯流排 應用程式的簡化程序,也包含 服務匯流排 特有設定的討論。

除了設定要向服務匯流排登錄的 WCF 服務中討論的問題之外,服務匯流排 服務還必須決定需要何種類型的驗證和傳輸安全性 (如果有的話)。 驗證安全性是服務連線至 服務匯流排 所需的安全性類型。 服務一律必須對 服務匯流排 出具驗證認證,此認證通常是共用密碼 (也就是,簽發者名稱和密碼) 權杖的形式。不過,服務也會決定用戶端應用程式必須使用哪種類型的驗證認證,才能連線至服務。 用戶端驗證預設為 RelayClientAuthenticationType.RelayAccessToken,這表示用戶端必須向 服務匯流排 呈現某種形式的驗證。在目前的 服務匯流排 版本中,這一律是另一個共用密碼權杖。反之,傳輸安全性則決定是否必須使用某種形式的安全線路來進行連線。 這稱為「端對端」安全性,因為它涵蓋服務、服務匯流排 與用戶端之間的整個連線。 反之,用戶端驗證只涵蓋從服務連線至 服務匯流排 所需的關係。傳輸安全性預設為 EndToEndSecurityMode.Transport。這表示安全性是使用某種形式的安全傳輸 (例如 HTTPS) 所提供。 除非您有令人信服的變更原因,否則建議您將端對端安全性模式繼續設定為 Transport,因為進行變更可能會降低應用程式的安全性。如需以下內容的詳細資訊 安全性設定,請參閱保護與驗證服務匯流排連線

下列程序描述如何透過程式設計方式來設定 服務匯流排 服務。

  1. 建立含有您 服務命名空間 名稱和結構描述類型的端點 URI。

    string serviceNamespace = "myServiceNamespace";
    Uri uri = ServiceBusEnvironemnt.CreateServiceUri("sb", serviceNamespace, "sample/log/";
    
    

    首碼 "sb" 指出此 URI 使用 服務匯流排 結構描述。其他結構描述包括 HTTP 或 HTTPS。

  2. 使用合約和 URI 具現化主機。

    host = new ServiceHost(typeof(EchoService), uri);
    
  3. 宣告和實作要使用的驗證認證類型。

    string issuerName = "MY ISSUER NAME"
    string issuerSecret = "MY SECRET";
    TransportClientEndpointBehavior sharedSecretServiceBusCredential = new TransportClientEndpointBehavior();
    sharedSecretServiceBusCredential.CredentialType = TransportClientCredentialType.SharedSecret;
    sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerName = issuerName;
    sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerSecret = issuerSecret;
    

    所有服務都需要使用驗證認證來連線至 服務匯流排。請注意,將簽發者名稱和密碼寫入至您的程式碼,並不是安全的作法。 例如,許多服務匯流排範例會提示使用者提供此資訊。

  4. 宣告合約的類型和執行個體。

    ContractDescription contractDescription = ContractDescription.GetContract(typeof(IEchoContract), typeof(EchoService));
    
  5. 將合約說明新增至服務端點。

    ServiceEndpoint serviceEndPoint = new ServiceEndpoint(contractDescription);
    
  6. 將 URI 新增至服務端點。

    serviceEndPoint.Address = new EndpointAddress(uri);
    
  7. 宣告要用於端點的繫結類型。

    serviceEndPoint.Binding = new NetTcpRelayBinding();
    

    此時,您可以宣告 AuthenticationEndToEndSecurity 模式。此特殊範例使用預設建構函式將 EndToEndSecurityMode 設定為 Transport 並將 RelayClientAuthenticationType 設定為 RelayAccessToken。 因此,下列程式碼片段與預設建構函式相同,唯一的差異在於它明確地設定這兩個參數:

    serviceEndPoint.Binding = new NetTcpRelayBinding(EndToEndSecurityMode.Transport, RelayClientAuthenticationType.RelayAccessToken);
    
  8. 將安全性認證新增至端點。

    serviceEndpoint.Behaviors.Add(sharedSecretServiceBusCredential);
    

    所有服務都需要這些安全性認證,才能向 服務匯流排 進行驗證。因為我們將 RelayClientAuthenticationType 設定為 RelayAccessToken (預設或明確地),所以所有用戶端應用程式也需要使用相同類型的驗證認證。

  9. 將端點新增至主機。

    host.Description.Endpoints.Add(serviceEndPoint);
    

    您現在已建立 服務匯流排 服務應用程式所需的最低設定。 此時,您可以新增其他服務層級或端點層級設定,就與處理任何其他 WCF 應用程式一樣。如需以下內容的詳細資訊 設定 WCF 應用程式,請參閱 WCF 文件中的Configuring Services。完成應用程式的設定時,就可以裝載和執行應用程式。如需詳細資訊,請參閱 建置服務匯流排的服務.

範例

下列範例顯示如何透過程式設計方式定義設定資訊。 主要差異是所有資訊都是透過程式設計方式所設定;在教學課程中,部分非 服務匯流排 特有的資訊會儲存在 App.config 檔案中。


namespace AzureSample_WorkerRole
{
    public class WorkerRole : RoleEntryPoint
    {
        private ServiceHost host;

        public override void Start()
        {
            string serviceNamespace = "myDomainName";
            string issuerName = "MY ISSUER NAME"
            string issuerSecret = "MY SECRET";

            Uri uri = ServiceBusEnvironemnt.CreateServiceUri("sb", serviceNamespace, "sample/log/";
            
            host = new ServiceHost(typeof(EchoService), uri);

            TransportClientEndpointBehavior sharedSecretServiceBusCredential = new TransportClientEndpointBehavior();
            sharedSecretServiceBusCredential.CredentialType = TransportClientCredentialType.SharedSecret;
            sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerName = issuerName;
            sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerSecret = issuerSecret;

            ContractDescription contractDescription = ContractDescription.GetContract(typeof(IEchoContract), typeof(EchoService));

            ServiceEndpoint serviceEndPoint = new ServiceEndpoint(contractDescription);
            serviceEndPoint.Address = new EndpointAddress(uri);
            
            serviceEndPoint.Binding = new NetTcpRelayBinding();
            
           serviceEndpoint.Behaviors.Add(sharedSecretServiceBusCredential);
            host.Description.Endpoints.Add(serviceEndPoint);

            host.Open();

            while (true)
            {
                //Loop
            }
        }

        public override void Stop()
        {
            host.Close();
            base.Stop();
        }

        public override RoleStatus GetHealthStatus()
        {
            // This is a sample worker implementation. Replace with your logic.
            return RoleStatus.Healthy;
        }
    }
}

顯示:
© 2014 Microsoft