首页 文章

如何从Azure服务总线队列中读取ASP.NET MVC应用程序?

提问于
浏览
3

我在windows azure中运行了一个worker角色,它会生成消息 . 我有一个ASP.NET MVC应用程序,它有一个SignalR中心 . 我想将消息从worker角色推送到SignalR中心,然后将这些消息实时推送到连接的客户端 . 我的想法是使用ASP.NET MVC应用程序可以读取的Azure服务总线队列 . 这一切似乎都很简单,但我不确定如何在MVC应用程序中连接服务总线QueueClient . 我可以在ASP.NET MVC中找到大量样本,将消息放入队列中,由工作者角色服务获取,但不是相反 .

Question :有办法吗?有人能指点我一些样品的方向吗?

3 回答

  • 2

    在我们的项目中,我们在MvcApplication> Application_Start上使用它:

    new Thread(t => Container.Resolve<IMessageRouter>().StartRouting()).Start();
    

    我们也使用DI(Windsor容器),路由器注册为Transient . 路由器以并行线程中的web应用程序开始并一直工作 .

    路由器具有SignalR集线器连接上下文和主题侦听器(主题客户端包装器):

    public class MessageRouter : IMessageRouter
    {
        private string _subscriptionName = "Subscription_0";
    
        private IHubConnectionContext ClientContext
        {
            get { return GlobalHost.ConnectionManager.GetHubContext<MessageHub>().Clients; }
        }
    
        private RoleInstance CurrentRoleInstance
        {
            get // try to get current Azure role instance
            {
                if (RoleEnvironment.IsAvailable && RoleEnvironment.CurrentRoleInstance != null)
                {
                    return Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.CurrentRoleInstance;
                }
    
                return null; // return null if not Azure environment
            }
        }
    
        private string TopicName
        {
            get { return ConfigurationHelper.TopicName; }
        }
    
        private string TopicConnectionString
        {
            get { return ConfigurationHelper.TopicConnectionString; }
        }
    
        public ITopicListener TopicListener { get; set; }
    
        public void OnMessage(QueueMessage message)
        {
            ClientContext.Group(message.GetRecipientGroup()).updateProgress(message.GetBody<string>());
        }
    
        public void StartRouting()
        {
            TopicListener.Bind(TopicConnectionString, TopicName, _subscriptionName).StartListening(OnMessage);
        }
    
        public MessageRouter()
        {
            if (CurrentRoleInstance != null) // check Azure environment is exist
            {
                int instanceIndex = 0; string instanceId = CurrentRoleInstance.Id;
    
                if (!int.TryParse(instanceId.Substring(instanceId.LastIndexOf(".") + 1), out instanceIndex)) // on cloud
                {
                    int.TryParse(instanceId.Substring(instanceId.LastIndexOf("_") + 1), out instanceIndex); // on compute emulator
                }
    
                _subscriptionName = String.Format("{0}_{1}", CurrentRoleInstance.Role.Name, instanceIndex);
            }
        }
    }
    

    它有效 . 希望这可以帮助 .

  • 2

    阅读"How to Receive Messages from a Queue" in http://www.windowsazure.com/en-us/documentation/articles/service-bus-dotnet-how-to-use-queues/

    但是,如果您有一个工作者角色生成消息并且您想使用SignalR,我建议将该工作者角色用作SignalR的广播中心 - 请参阅Tutorial: Server Broadcast with SignalR 2.0

  • -1
    //Fetch connection string from config  
            string connectionString = ConfigurationManager.AppSettings["connectionString"];
            // Create the connection 
            MessagingFactory factory = MessagingFactory.CreateFromConnectionString(connectionString);
            //Provide the queue name in the service bus
            MessageReceiver receiver = factory.CreateMessageReceiver("queue Name");
            BrokeredMessage retrievedMessage = receiver.Receive();
            if (retrievedMessage != null)
            {
                try
                {
                    string output = retrievedMessage.GetBody<string>();
                    //In the output string you will get the message from the queue.
                    retrievedMessage.Complete();
                }
                catch (Exception ex)
                {
                    retrievedMessage.Abandon();
                }
            }
    

相关问题