我在windows azure中运行了一个worker角色,它会生成消息。我有一个ASP.NET MVC应用程序,它有一个SignalR中心。我想将消息从worker角色推送到SignalR中心,然后将这些消息实时推送到连接的客户端。我的想法是使用ASP.NET MVC应用程序可以读取的Azure服务总线队列。这一切似乎都很简单,但我不确定如何在MVC应用程序中连接服务总线QueueClient。我可以在ASP.NET MVC中找到大量样本,将消息放入队列中,由工作者角色服务提取,但不是相反。
问题:有办法吗?有人能指点我的方向等吗?
答案 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();
}
}