Windows Azure Platform AppFabric

Windows Azure Platform AppFabric 是Windows Azure雲端運算服務的一部份，亦為平台即服務(PaaS)的一種類型，它是Windows Azure上的應用程式伺服器 (Application Server) 平台，作為開發身分驗證，存取控制以及服務匯流排 (Service Bus) 應用程式之用。它本身也是奠基於 Windows Azure 作業系統之上，並且以 WCF (Windows Communication Foundation) 為核心開發的。

概觀

Windows Azure Platform AppFabric 一開始命名是.NET Service，要作為在 Windows Azure 上的 .NET Framework 特殊服務的一種服務平台，原始的規劃中包含了存取控制 (Access Control)，服務匯流排以及工作流程引擎 (Workflow Engine)，但到了 2009 年的 PDC，正式發表 AppFabric SDK 1.0 時，工作流程引擎被抽掉，原因可能是微軟在開發 Workflow Engine 時，尚未解決因雲端運算特性所導致的分散式運算與狀態整合與管理的問題，因此在 AppFabric 1.0 版中這項服務被抽掉了。
在 AppFabric 中，每一項服務都有一個服務命名空間 (service namespace)，這個命名空間會作為應用程式呼叫 AppFabric 時所使用的 URL 的一部份，

服務

AppFabric 目前包含兩種服務：存取控制以及服務匯流排，作為開發企業服務導向架構 (SOA) 應用程式的基礎平台，同時可與其他不同的驗證服務整合，形成邦聯化驗證與存取控制服務 (Federated Access Control)。
在2010年10月28日舉辦的PDC 2010中，微軟宣布將會在 Windows Azure Platform AppFabric 中加入像 Cache, Integration 與 Composite Applications 等功能，讓 Windows Azure AppFabric 在雲端應用程式上的作為中介應用程伺服器的角色更明確。

存取控制

存取控制是 AppFabric 中作為應用程式使用者身分驗證的資料庫，並作為服務匯流排服務與其他 AppFabric 上的身分驗證服務。

服務匯流排

服務匯流排是要讓 Windows Azure 可作為企業服務應用程式前端 (顯露服務與轉接訊息等) 的一個服務，它本身是由 WCF 所組成，同時由於服務匯流排是負責處理使用者呼叫的前端介面，基於服務匯流排的特性，AppFabric Service Bus 會將要求訊息轉送給服務應用程式，這個程序被稱為 Relay，因此 AppFabric SDK 中內含了一個 Microsoft.ServiceBus.dll 組件，它封裝了改寫 WCF 通訊協定的各項必要元件，像是 TCP 與 HTTP 均可以透過 Service Bus 進行轉傳，但並不是所有的 WCF 協定都可以被轉傳，像是 MSMQ 以及具名管道等都不在受支援之列。
AppFabric Service Bus 由於是利用 WCF 進行通訊，因此使用它的服務應用程式也需要以 WCF 來開發。
下列程式是一個 AppFabric Service Bus 服務應用程式的簡單範例：
using System;using System.ServiceModel;using System.ServiceModel.Description;using Microsoft.ServiceBus;using Microsoft.ServiceBus.Description;using System.Text;namespace Microsoft.ServiceBus.Samples{#region Service Contract    [ServiceContract(Name = "IEchoContract", Namespace = "http://samples.microsoft.com/ServiceModel/Relay/EchoV1")]

    public interface IEchoContract
    {        [OperationContract]
        String Echo(string text);
    }

    public interface IEchoChannel : IEchoContract, IClientChannel { };#endregion#region Echo Service    [ServiceBehavior(Name = "EchoService", Namespace = "http://samples.microsoft.com/ServiceModel/Relay/EchoV1")]

    public class EchoService : IEchoContract
    {
        public string Echo(string text)
        {
            Console.WriteLine("Echoing: {0}", text);
            return text;
        }
    }#endregion#region Host Service

    class Program
    {
        static void Main(string[] args)
        {

            ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.AutoDetect;

            
            // Hard-code the service namespace, issuer name, and issuer secret into the application.
            // Note: The credentials are hard-coded in this sample for simplicity purposes but doing so is not considered a secure programming practice.
            string serviceNamespace = "putServiceNamespaceHere";
            string issuerName= "putIssuerNameHere";
            string issuerSecret = "putIssuerSecretHere";

            // Create the service URI based on the solution name.
            Uri address = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, "EchoService");



           // create the credentials object for the endpoint
            TransportClientEndpointBehavior sharedSecretServiceBusCredential = new TransportClientEndpointBehavior();
            sharedSecretServiceBusCredential.CredentialType = TransportClientCredentialType.SharedSecret;
            sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerName = issuerName;
            sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerSecret = issuerSecret;

            // create the service host reading the configuration
            ServiceHost host = new ServiceHost(typeof(EchoService), address);

            // create the ServiceRegistrySettings behavior for the endpoint
            IEndpointBehavior serviceRegistrySettings = new ServiceRegistrySettings(DiscoveryType.Public);

            // add the Service Bus credentials to all endpoints specified in configuration
            foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
            {
                endpoint.Behaviors.Add(serviceRegistrySettings);
                endpoint.Behaviors.Add(sharedSecretServiceBusCredential);
            }
            
            // open the service
            host.Open();

            Console.WriteLine("Service address: " + address);
            Console.WriteLine("Press [Enter] to exit");
            Console.ReadLine();

            // close the service
            host.Close();
        }
    }

    #endregion}
AppFabric Service Bus 除了基本的服務通訊轉送之外，它還支援了服務登入 (Service Registration)，服務搜尋 (Service Discovery) 以及訊息緩衝區 (Message Buffer，類似 queue 服務)  等功能。

快取服務

Windows Azure AppFabric 的快取服務 (Caching Services)，是以微軟的 Windows Server AppFabric 內的 Cache Service (研發代號為 Velocity) 為核心所組成，它是與memcached相同能力的分散式快取服務 (Distributed Cache Services)，現階段會直接支援 ASP.NET 的快取 API (Cache API)，不過基於雲端的特殊環境，它不支援所有在 Windows Server AppFabric Cache Service 上支援的快取功能，Caching Service 在2011年4月正式投入商轉，並以快取容量 (Cache Capability) 為單位計費。
Caching Service 的 API 相當直覺，以 ASP.NET 來說，只要設定 Cache Provider (ASP.NET v4.0 以後的版本) 即可直接取用 Caching Service 的服務，或是如下程式碼，直接以 API 來存取 Caching Service。
// Declare array for cache host.DataCacheServerEndpoint[] servers = new DataCacheServerEndpoint[1];servers[0] = new DataCacheServerEndpoint("mytest.cache.int4.windows-test.net", 22233);// Setup DataCacheSecurity configuration.string strACSKey = "YWNzOmh0dHBzzzzvanJvdGhkb2N1bWVudGF0aW9udGVzdGluZy111WNoZS5hY2Nlc3Njb250cm9sLmlud" +
    "DMud2luZG93cy1pbnQubmV0L1dSQVB2MC45LyZvd25lciY0eDhHZTA5SlZTTUQ2VWIyWkNiaWlES1c0NXNzOFIxZjdWZVp0Y3lF" +
    "T2FFPSZodHRwOi8vSnJvdGhEb2N1bWVudGF0aW9uVGVzdGluZy5jYWNoZS5pbnQzLndpbmRvd3MtaW50Lm5ldA==";var secureACSKey = new SecureString();foreach (char a in strACSKey){
   secureACSKey.AppendChar(a);}secureACSKey.MakeReadOnly();DataCacheSecurity factorySecurity = new DataCacheSecurity(secureACSKey);// Setup the DataCacheFactory configuration.DataCacheFactoryConfiguration factoryConfig = new DataCacheFactoryConfiguration();factoryConfig.Servers = servers;factoryConfig.SecurityProperties = factorySecurity;// Create a configured DataCacheFactory object.DataCacheFactory cacheFactory = new DataCacheFactory(factoryConfig);// Get a cache client for the default cache.DataCache defaultCache = cacheFactory.GetDefaultCache();// Add and retrieve a test object from the default cache.defaultCache.Add("testkey", "testobject");string strObject = (string)defaultCache.Get("testkey");

應用程式開發支援

AppFabric 的存取控制以及 Service Bus 的必要功能，都顯露了 REST API 供不同的用戶端存取，開發人員只需要利用這些 API 即可存取 AppFabric 中的服務，尤其是 Access Control 在建立帳戶這個程序上，若利用 REST API 會較使用 acm.exe 工具快很多。
同時，AppFabric SDK 也包含了檔案以及 Service Bus 所必要的組件 (即 Microsoft.ServiceBus.dll)，以供開發人員使用。