를 참조하십시오. 병렬 스레드에서 웹 응용 프로그램으로 시작하고 항상 작동하는 라우터.
라우터는 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);
}
}
}
을 그리고 그것은 작동합니다. 희망이 도움이됩니다.
내가 찾고 있던 것과 정확히 같은 종류의 - 많은 감사와 많은 감사. 이 같은 MVC 애플 리케이션 내에서 다른 스레드를 스핀 꽤 합법적입니까? 그리고 서버 브로드 캐스트 패턴을 살펴보면 @viperguynaz와 비슷한 클라이언트 컨텍스트를 얻게됩니다. 또한 Brady Gaster의 [post] (http://www.bradygaster.com/post/from-the-cloud-to-the-client) (아마도 대체되었지만)에서 sb 큐 클라이언트를 SignalR 허브에 주입하는 것에 관심이 있습니다 . 도와 줘서 고마워. – jcaddy