Windows Azure Appfabric Service Bus Code
2012-01-31 18:22
615 查看
Service Bus
Queue
QueueDescription
Session
Duplicate Message Detect
Transaction
Defer Message
Delete Letter Queue
Sender:
Receiver:
Topic
Routing, subscriber to different subscription
Filter, filter message by property
Sender
Receiver
Relay Service
Server
Note: when ServiceRegistrySettings is public discovery, you will able to see the feed "Temperature Service" in the https://youaretheone.servicebus.windows.net/
Client:
Publisher - Subscriber : netEventRelayBinding (Oneway)
Subscriber: ALL WCF Services
Subscriber:
Subscriber Configuration
Publisher:
Publisher Configuration
Queue
QueueDescription
Session
Duplicate Message Detect
Transaction
Defer Message
Delete Letter Queue
Sender:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.WindowsAzure; using Microsoft.WindowsAzure.StorageClient; using System.Threading.Tasks; using System.IO; using System.Collections.Specialized; using System.Data.Services.Client; using System.Threading; using Microsoft.ServiceBus; using Microsoft.ServiceBus.Messaging; using System.Transactions; namespace AzureTest { class Program { static void Main(string[] args) { string issuename = System.Configuration.ConfigurationManager.AppSettings["servicebusissuename"]; string issuekey = System.Configuration.ConfigurationManager.AppSettings["servicebusissuekey"]; string servicenamespace = System.Configuration.ConfigurationManager.AppSettings["servicebusnamespace"]; string queuename = "newqueue"; //Token TokenProvider credentials = TokenProvider.CreateSharedSecretTokenProvider(issuename, issuekey); Uri serviceUri = ServiceBusEnvironment.CreateServiceUri("sb", servicenamespace, string.Empty); MessagingFactory factory = null; /***********************NameSpace*****************************************/ NamespaceManager namespaceClient = new NamespaceManager(serviceUri, credentials); if (namespaceClient == null) { Console.WriteLine("\nUnexpected Error: NamespaceManager is NULL"); return; } // Configure Queue Settings QueueDescription queueDescription = new QueueDescription(queuename); //queueDescription.RequiresSession = true; queueDescription.RequiresDuplicateDetection = true;//duplicate messages are detected and dropped by the queue itself // Delete if exists if (namespaceClient.QueueExists(queueDescription.Path)) { //namespaceClient.DeleteQueue(queuename); Console.WriteLine("\nQueue is existing"); } else { namespaceClient.CreateQueue(queueDescription); } /***********************QueueClient*****************************************/ factory = MessagingFactory.Create(serviceUri, credentials); QueueClient myQueueClient = factory.CreateQueueClient(queuename); //1.....................Send Normal Message //BrokeredMessage message = new BrokeredMessage("issueBody"); //myQueueClient.Send(message); //Console.WriteLine(string.Format("Message sent: Id = {0}, Body = {1}", message.MessageId, message.GetBody<string>())); //2......................Send Session Message //BrokeredMessage sessionmessage = new BrokeredMessage("session 1 issue Body"); //sessionmessage.SessionId = "1"; //myQueueClient.Send(sessionmessage); //Console.WriteLine(string.Format("Message sent: Id = {0}, Body = {1}", sessionmessage.MessageId, sessionmessage.GetBody<string>())); //BrokeredMessage sessionmessage2 = new BrokeredMessage("session 2 issue Body"); //sessionmessage2.SessionId = "2"; //myQueueClient.Send(sessionmessage2); //Console.WriteLine(string.Format("Message sent: Id = {0}, Body = {1}", sessionmessage2.MessageId, sessionmessage2.GetBody<string>())); //3......................Send duplicate message //BrokeredMessage message = new BrokeredMessage("issueBody"); //message.MessageId = "123"; //myQueueClient.Send(message); //BrokeredMessage message2 = new BrokeredMessage("issueBody"); //message2.MessageId = "123"; //myQueueClient.Send(message2); //BrokeredMessage message3 = new BrokeredMessage("issueBody"); //message3.MessageId = "123"; //myQueueClient.Send(message3); //4........................Defer Message Sample //BrokeredMessage message = new BrokeredMessage("issueBody"); //message.MessageId = "123"; //myQueueClient.Send(message); //BrokeredMessage message2 = new BrokeredMessage("issueBody"); //message2.MessageId = "456"; //myQueueClient.Send(message2); //Console.WriteLine(string.Format("Message sent: Id = {0}, Body = {1}", message.MessageId, message.GetBody<string>())); //5.........................Transaction //using (TransactionScope scope = new TransactionScope()) //{ // //Scenarios: Only when recieve a message and process then send a new message // // This call to Send(BrokeredMessage) takes part in the local transaction and will // // not persist until the transaction Commits; if the transaction is not committed, // // the operation will Rollback // //sender.Send(replyMessage); // // This call to Complete() also takes part in the local transaction and will not // // persist until the transaction Commits; if the transaction is not committed, the // // operation will Rollback // //receivedMessage.Complete(); //} //6.................Log the dead-lettered messages that could not be processed BrokeredMessage message = new BrokeredMessage("issueBody"); message.MessageId = "123"; myQueueClient.Send(message); Console.WriteLine(string.Format("Message sent: Id = {0}, Body = {1}", message.MessageId, message.GetBody<string>())); Console.WriteLine("End"); Console.ReadKey(); } } }
Receiver:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.ServiceBus; using Microsoft.ServiceBus.Messaging; namespace Receiver { class Program { static void Main(string[] args) { string issuename = System.Configuration.ConfigurationManager.AppSettings["servicebusissuename"]; string issuekey = System.Configuration.ConfigurationManager.AppSettings["servicebusissuekey"]; string servicenamespace = System.Configuration.ConfigurationManager.AppSettings["servicebusnamespace"]; string queuename = "newqueue"; //Token TokenProvider credentials = TokenProvider.CreateSharedSecretTokenProvider(issuename, issuekey); Uri serviceUri = ServiceBusEnvironment.CreateServiceUri("sb", servicenamespace, string.Empty); MessagingFactory factory = null; /***********************NameSpace*****************************************/ NamespaceManager namespaceClient = new NamespaceManager(serviceUri, credentials); if (namespaceClient == null) { Console.WriteLine("\nUnexpected Error: NamespaceManager is NULL"); return; } QueueDescription queueDescription = namespaceClient.GetQueue(queuename); if (queueDescription == null) { Console.WriteLine("\nUnexpected Error: QueueDescription is NULL"); return; } /***********************QueueClient*****************************************/ factory = MessagingFactory.Create(serviceUri, credentials); QueueClient myQueueClient = factory.CreateQueueClient(queuename,ReceiveMode.PeekLock); long messageCount = queueDescription.MessageCount; //1.......................Receive All Message //BrokeredMessage message; //for (long count = 0; count < messageCount; count++) //{ // message = myQueueClient.Receive(TimeSpan.FromSeconds(5)); // if (message != null) // { // Console.WriteLine(string.Format("Message received: Id = {0}, Body = {1}", message.MessageId, message.GetBody<string>())); // // Further custom message processing could go here... // message.Complete(); // } // else // { // Console.WriteLine("Unexpected Error, Did not receive the messages"); // } //} //2.........................Receive only Session Message - only receive session id="1" //MessageSession sessionReceiver = myQueueClient.AcceptMessageSession("1",TimeSpan.FromSeconds(60)); //Console.WriteLine("sessionReceiver Session ID:" + sessionReceiver.SessionId); //BrokeredMessage receivedMessage; //while ((receivedMessage = sessionReceiver.Receive(TimeSpan.FromSeconds(15))) != null) //{ // string sessionId = sessionReceiver.SessionId; // receivedMessage.Complete(); // Console.WriteLine(string.Format("Message sent: Id = {0}, Body = {1}, SessionId={2}", // receivedMessage.MessageId, // receivedMessage.GetBody<string>(), // receivedMessage.SessionId)); //} //3......................Duplicate Message detect //string receivedMessageId = ""; //while (true) //{ // BrokeredMessage receiveMessage = myQueueClient.Receive(TimeSpan.FromSeconds(10)); // if (receiveMessage == null) // { // break; // } // else // { // Console.WriteLine("\t<= Received a message with messageId {0}", receiveMessage.MessageId); // receiveMessage.Complete(); // if (receivedMessageId.Equals(receiveMessage.MessageId, StringComparison.OrdinalIgnoreCase)) // { // Console.WriteLine("\t\tRECEIVED a DUPLICATE MESSAGE"); // } // receivedMessageId = receiveMessage.MessageId; // } //} //4...................Defer Message //long deferMessageSequenceNumber=0; //while (true) //{ // BrokeredMessage receiveMessage = myQueueClient.Receive(TimeSpan.FromSeconds(10)); // if (receiveMessage == null) // { // break; // } // else // { // if (receiveMessage.MessageId.Equals("123")) // { // receiveMessage.Defer(); // deferMessageSequenceNumber = receiveMessage.SequenceNumber; // } // else // { // Console.WriteLine(string.Format("Message sent: Id = {0}, Body = {1}", receiveMessage.MessageId, receiveMessage.GetBody<string>())); // } // } //} //BrokeredMessage deferMessage = myQueueClient.Receive(deferMessageSequenceNumber); //Console.WriteLine(string.Format("Message sent: Id = {0}, Body = {1}", deferMessage.MessageId, deferMessage.GetBody<string>())); //5.........................Transaction(Ignore) //6.........................Log the dead-lettered messages that could not be processed BrokeredMessage receiveMessage = myQueueClient.Receive(TimeSpan.FromSeconds(10)); receiveMessage.DeadLetter("UnableToProcess", "Failed to process in reasonable attempts"); QueueClient deadLetterClient = factory.CreateQueueClient(QueueClient.FormatDeadLetterPath(myQueueClient.Path), ReceiveMode.ReceiveAndDelete); BrokeredMessage receivedDeadLetterMessage; while ((receivedDeadLetterMessage = deadLetterClient.Receive(TimeSpan.FromSeconds(10))) != null) { Console.WriteLine(string.Format("Message sent: Id = {0}, Body = {1}", receivedDeadLetterMessage.MessageId, receivedDeadLetterMessage.GetBody<string>())); } Console.WriteLine("End"); Console.ReadKey(); } } }
Topic
Routing, subscriber to different subscription
Filter, filter message by property
Sender
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.WindowsAzure; using Microsoft.WindowsAzure.StorageClient; using System.Threading.Tasks; using System.IO; using System.Collections.Specialized; using System.Data.Services.Client; using System.Threading; using Microsoft.ServiceBus; using Microsoft.ServiceBus.Messaging; using System.Transactions; namespace AzureTest { class Program { static void Main(string[] args) { string issuename = System.Configuration.ConfigurationManager.AppSettings["servicebusissuename"]; string issuekey = System.Configuration.ConfigurationManager.AppSettings["servicebusissuekey"]; string servicenamespace = System.Configuration.ConfigurationManager.AppSettings["servicebusnamespace"]; //Token TokenProvider credentials = TokenProvider.CreateSharedSecretTokenProvider(issuename, issuekey); Uri serviceUri = ServiceBusEnvironment.CreateServiceUri("sb", servicenamespace, string.Empty); /***********************NameSpace*****************************************/ NamespaceManager namespaceClient = new NamespaceManager(serviceUri, credentials); if (namespaceClient == null) { Console.WriteLine("\nUnexpected Error: NamespaceManager is NULL"); return; } TopicDescription myTopic=null; SubscriptionDescription myAuditSubscription = null; SubscriptionDescription myAgentSubscription = null; SubscriptionDescription myFilterSubscription = null; if (!namespaceClient.TopicExists("IssueTrackingTopic")) { myTopic = namespaceClient.CreateTopic("IssueTrackingTopic"); } else { myTopic = namespaceClient.GetTopic("IssueTrackingTopic"); } if (!namespaceClient.SubscriptionExists("IssueTrackingTopic", "AuditSubscription")) { myAuditSubscription = namespaceClient.CreateSubscription(myTopic.Path, "AuditSubscription"); } else { myAuditSubscription = namespaceClient.GetSubscription(myTopic.Path, "AuditSubscription"); } if (!namespaceClient.SubscriptionExists("IssueTrackingTopic", "AgentSubscription")) { myAgentSubscription = namespaceClient.CreateSubscription(myTopic.Path, "AgentSubscription"); } else { myAgentSubscription = namespaceClient.GetSubscription(myTopic.Path, "AgentSubscription"); } if (!namespaceClient.SubscriptionExists("IssueTrackingTopic", "FilterSubscription")) { myFilterSubscription = namespaceClient.CreateSubscription(myTopic.Path, "FilterSubscription", new SqlFilter("color = 'blue' AND quantity = 10")); } else { myFilterSubscription = namespaceClient.GetSubscription(myTopic.Path, "FilterSubscription"); } MessagingFactory factory = MessagingFactory.Create(serviceUri, credentials); TopicClient myTopicClient = factory.CreateTopicClient(myTopic.Path); BrokeredMessage message = new BrokeredMessage("messageissue"); myTopicClient.Send(message); Console.WriteLine( string.Format("Message sent: Id = {0}, Body = {1}", message.MessageId, message.GetBody<string>())); BrokeredMessage message2 = new BrokeredMessage("messageissue2"); myTopicClient.Send(message2); Console.WriteLine( string.Format("Message sent: Id = {0}, Body = {1}", message2.MessageId, message2.GetBody<string>())); BrokeredMessage message3 = new BrokeredMessage("message3"); message3.CorrelationId = "high"; message3.Properties.Add("color", "blue"); message3.Properties.Add("quantity", 10); myTopicClient.Send(message3); Console.WriteLine( string.Format("Message sent: Id = {0}, Body = {1}", message3.MessageId, message3.GetBody<string>())); BrokeredMessage message4 = new BrokeredMessage("message4"); message4.CorrelationId = "low"; message4.Properties.Add("color", "white"); message4.Properties.Add("quantity", "10"); myTopicClient.Send(message4); Console.WriteLine( string.Format("Message sent: Id = {0}, Body = {1}", message4.MessageId, message4.GetBody<string>())); Console.WriteLine("End"); Console.ReadKey(); } } }
Receiver
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.ServiceBus; using Microsoft.ServiceBus.Messaging; namespace Receiver { class Program { static void Main(string[] args) { string issuename = System.Configuration.ConfigurationManager.AppSettings["servicebusissuename"]; string issuekey = System.Configuration.ConfigurationManager.AppSettings["servicebusissuekey"]; string servicenamespace = System.Configuration.ConfigurationManager.AppSettings["servicebusnamespace"]; //Token TokenProvider credentials = TokenProvider.CreateSharedSecretTokenProvider(issuename, issuekey); Uri serviceUri = ServiceBusEnvironment.CreateServiceUri("sb", servicenamespace, string.Empty); /***********************NameSpace*****************************************/ NamespaceManager namespaceClient = new NamespaceManager(serviceUri, credentials); if (namespaceClient == null) { Console.WriteLine("\nUnexpected Error: NamespaceManager is NULL"); return; } MessagingFactory factory = MessagingFactory.Create(serviceUri, credentials); //1...............................Routing SubscriptionClient agentSubscriptionClient = factory.CreateSubscriptionClient("IssueTrackingTopic", "AgentSubscription", ReceiveMode.PeekLock); SubscriptionClient auditSubscriptionClient = factory.CreateSubscriptionClient("IssueTrackingTopic", "AuditSubscription", ReceiveMode.ReceiveAndDelete); BrokeredMessage message; while ((message = agentSubscriptionClient.Receive(TimeSpan.FromSeconds(5))) != null) { Console.WriteLine("\nReceiving message from AgentSubscription..."); Console.WriteLine(string.Format("Message received: Id = {0}, Body = {1}", message.MessageId, message.GetBody<string>())); // Further custom message processing could go here... message.Complete(); } // Create a receiver using ReceiveAndDelete mode while ((message = auditSubscriptionClient.Receive(TimeSpan.FromSeconds(5))) != null) { Console.WriteLine("\nReceiving message from AuditSubscription..."); Console.WriteLine(string.Format("Message received: Id = {0}, Body = {1}", message.MessageId, message.GetBody<string>())); // Further custom message processing could go here... } //2..............................Filter SubscriptionClient filterSubscriptionClient = factory.CreateSubscriptionClient("IssueTrackingTopic", "FilterSubscription", ReceiveMode.ReceiveAndDelete); // Create a receiver using ReceiveAndDelete mode while ((message = filterSubscriptionClient.Receive(TimeSpan.FromSeconds(5))) != null) { Console.WriteLine("\nReceiving message from filterSubscription..."); Console.WriteLine(string.Format("Filtered Message received: Id = {0}, Body = {1}", message.MessageId, message.GetBody<string>())); // Further custom message processing could go here... } Console.WriteLine("End"); Console.ReadKey(); } } }
Relay Service
Server
Note: when ServiceRegistrySettings is public discovery, you will able to see the feed "Temperature Service" in the https://youaretheone.servicebus.windows.net/
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.WindowsAzure; using Microsoft.WindowsAzure.StorageClient; using System.Threading.Tasks; using System.IO; using System.Collections.Specialized; using System.Data.Services.Client; using System.Threading; using Microsoft.ServiceBus; using Microsoft.ServiceBus.Messaging; using System.Transactions; using System.ServiceModel; namespace AzureTest { class Program { static void Main(string[] args) { string issuename = System.Configuration.ConfigurationManager.AppSettings["servicebusissuename"]; string issuekey = System.Configuration.ConfigurationManager.AppSettings["servicebusissuekey"]; string servicenamespace = System.Configuration.ConfigurationManager.AppSettings["servicebusnamespace"]; //Token TokenProvider credentials = TokenProvider.CreateSharedSecretTokenProvider(issuename, issuekey); Console.WriteLine("Server"); ServiceRegistrySettings registryBehavior = new ServiceRegistrySettings() { DiscoveryMode = DiscoveryType.Public, DisplayName = "Temperature Service" }; TransportClientEndpointBehavior credentialBehavior = new TransportClientEndpointBehavior(); credentialBehavior.TokenProvider = credentials; Uri serviceUri = ServiceBusEnvironment.CreateServiceUri("sb", servicenamespace, string.Empty); using (ServiceHost serviceHost = new ServiceHost(typeof(TemperatureService), serviceUri)) { NetTcpRelayBinding binding = new NetTcpRelayBinding(); serviceHost.AddServiceEndpoint(typeof(ITemperatureContract), binding, serviceUri); serviceHost.Description.Endpoints[0].Behaviors.Add( credentialBehavior); serviceHost.Description.Endpoints[0].Behaviors.Add( registryBehavior); serviceHost.Open(); Console.WriteLine("Press Enter to exit."); Console.ReadLine(); } Console.WriteLine("End"); Console.ReadKey(); } } }
Client:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.ServiceBus; using Microsoft.ServiceBus.Messaging; using System.ServiceModel; using AzureTest; namespace Receiver { class Program { static void Main(string[] args) { string issuename = System.Configuration.ConfigurationManager.AppSettings["servicebusissuename"]; string issuekey = System.Configuration.ConfigurationManager.AppSettings["servicebusissuekey"]; string servicenamespace = System.Configuration.ConfigurationManager.AppSettings["servicebusnamespace"]; //Token TokenProvider credentials = TokenProvider.CreateSharedSecretTokenProvider(issuename, issuekey); Uri serviceUri = ServiceBusEnvironment.CreateServiceUri("sb", servicenamespace, string.Empty); Console.WriteLine("Client"); TransportClientEndpointBehavior credentialBehavior =new TransportClientEndpointBehavior(); credentialBehavior.TokenProvider = credentials; NetTcpRelayBinding binding = new NetTcpRelayBinding(); EndpointAddress endpointAddress = new EndpointAddress(serviceUri); using (ChannelFactory<ITemperatureContract> channelFactory = new ChannelFactory<ITemperatureContract>( binding, endpointAddress)) { channelFactory.Endpoint.Behaviors.Add(credentialBehavior); ITemperatureContract channel =channelFactory.CreateChannel(); ((ICommunicationObject)channel).Open(); Double boilingPointCelsius = channel.ToCelsius(212); Double boilingPointFahrenheit = channel.ToFahrenheit(boilingPointCelsius); Console.WriteLine("212 Fahrenheit is {0} celsius", boilingPointCelsius); Console.WriteLine("{0} celsius is {1} Fahrenheit", boilingPointCelsius, boilingPointFahrenheit); ((ICommunicationObject)channel).Close(); Console.WriteLine("Press Enter to exit."); Console.ReadLine(); } Console.WriteLine("End"); Console.ReadKey(); } } }
Publisher - Subscriber : netEventRelayBinding (Oneway)
Subscriber: ALL WCF Services
Subscriber:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.WindowsAzure; using Microsoft.WindowsAzure.StorageClient; using System.Threading.Tasks; using System.IO; using System.Collections.Specialized; using System.Data.Services.Client; using System.Threading; using Microsoft.ServiceBus; using Microsoft.ServiceBus.Messaging; using System.Transactions; using System.ServiceModel; namespace AzureTest { class Program { static void Main(string[] args) { string issuename = System.Configuration.ConfigurationManager.AppSettings["servicebusissuename"]; string issuekey = System.Configuration.ConfigurationManager.AppSettings["servicebusissuekey"]; string servicenamespace = System.Configuration.ConfigurationManager.AppSettings["servicebusnamespace"]; string servicename = "AzureTest.TemperatureService"; //Token TokenProvider credentials = TokenProvider.CreateSharedSecretTokenProvider(issuename, issuekey); Console.WriteLine("Subscriber"); Uri serviceUri = ServiceBusEnvironment.CreateServiceUri("sb", servicenamespace, servicename); TransportClientEndpointBehavior credentialBehavior = new TransportClientEndpointBehavior(); credentialBehavior.TokenProvider = credentials; using (ServiceHost serviceHost = new ServiceHost(typeof(TemperatureService), serviceUri)) { serviceHost.Description.Endpoints[0].Behaviors.Add(credentialBehavior); serviceHost.Open(); Console.WriteLine("Press Enter to Exit"); Console.ReadLine(); } Console.WriteLine("End"); Console.ReadKey(); } } }
Subscriber Configuration
<system.serviceModel> <services> <service name="AzureTest.TemperatureService"> <endpoint name="RelayEndpoint" binding="netEventRelayBinding" contract="AzureTest.ITemperatureContract"/> </service> </services>
Publisher:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.ServiceBus; using Microsoft.ServiceBus.Messaging; using System.ServiceModel; using AzureTest; namespace Receiver { class Program { static void Main(string[] args) { string issuename = System.Configuration.ConfigurationManager.AppSettings["servicebusissuename"]; string issuekey = System.Configuration.ConfigurationManager.AppSettings["servicebusissuekey"]; string servicenamespace = System.Configuration.ConfigurationManager.AppSettings["servicebusnamespace"]; string servicename = "AzureTest.TemperatureService"; //Token TokenProvider credentials = TokenProvider.CreateSharedSecretTokenProvider(issuename, issuekey); Uri serviceUri = ServiceBusEnvironment.CreateServiceUri("sb", servicenamespace, servicename); Console.WriteLine("Publisher"); TransportClientEndpointBehavior credentialBehavior =new TransportClientEndpointBehavior(); credentialBehavior.TokenProvider = credentials; EndpointAddress endpointAddress = new EndpointAddress(serviceUri); using (ChannelFactory<ITemperatureContract> channelFactory = new ChannelFactory<ITemperatureContract>( "RelayEndpoint")) { channelFactory.Endpoint.Behaviors.Add(credentialBehavior); ITemperatureContract channel =channelFactory.CreateChannel(); ((ICommunicationObject)channel).Open(); channel.ToCelsius(212); channel.ToFahrenheit(212); ((ICommunicationObject)channel).Close(); Console.WriteLine("Press Enter to exit."); Console.ReadLine(); } Console.WriteLine("End"); Console.ReadKey(); } } }
Publisher Configuration
<system.serviceModel> <client> <endpoint name="RelayEndpoint" address="sb://youaretheone.servicebus.windows.net/AzureTest.TemperatureService" binding="netEventRelayBinding" contract="AzureTest.ITemperatureContract"/> </client>
相关文章推荐
- Windows Azure AppFabric 入门教学系列 (五):初探Access Control Service
- Windows Azure AppFabric 入门教学(七):多播(Multicast)
- Windows Azure真实案例:Invensys Operations Management -公司使用Windows Azure AppFabric 实现动态节能的智能电网
- Windows Azure AppFabric 入门教学系列 (五):初探Access Control Service
- Windows Azure AppFabric 入门教学系列 (六):Message Buffer之初体验
- Windows Azure Service Bus
- Windows Azure AppFabric (一) 平台简介
- Windows Azure真实案例:Invensys Operations Management -公司使用Windows Azure AppFabric 实现动态节能的智能电网
- Windows Azure AppFabric 入门教学系列 (五):初探Access Control Service
- Windows Azure Service Bus (4) Service Bus Queue和Storage Queue的区别
- Windows Azure AppFabric 入门教学系列 (六):Message Buffer之初体验
- Windows Azure真实案例:Invensys Operations Management -公司使用Windows Azure AppFabric 实现动态节能的智能电网
- Windows Azure AppFabric 入门教学系列 (一):创建 AppFabric 项目与命名空间
- Windows Azure AppFabric 入门教学系列 (六):Message Buffer之初体验
- Windows Azure Service Bus Topics实现系统松散耦合
- Windows Azure AppFabric Caching服务发布!
- Windows Azure AppFabric 入门教学系列 (二):一个简单的Service Bus例子
- Windows Azure Service Bus (2) 队列(Queue)入门
- Windows Azure AppFabric 入门教学系列 (三):LABS环境