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

时间:2014-01-13 22:54:14

标签: asp.net-mvc azure signalr servicebus

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

问题:有办法吗?有人能指点我的方向等吗?

3 个答案:

答案 0 :(得分:2)

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 :(得分: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 :(得分:-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();
            }
        }