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)，以供开发人员使用。