Servicebus主题消息从signalR Hub到特定客户端

时间:2015-12-28 15:47:14

标签: c# asp.net-web-api signalr servicebus

我们正在尝试将主题消息发送给曾经请求过的尊贵连接客户端。集线器托管在具有持久连接的WebRole中。

目前实施的方法是

1:客户端必须提出订阅组的初始请求,之后它不会对服务器方法进行任何调用,但它会等待来自服务器的消息。

///Tenantid-fix KnownIDToClient
[HubMethodName("subscribe")]
public async Task Subscribe(string tenantid)
{
 if (!string.IsNullOrWhiteSpace(tenantid))  
 await Groups.Add(Context.ConnectionId, tenantid);
}

2:Http Post请求在订阅方法调用之后立即启动订阅客户端的onMessage进程。

 [HttpPost]
 [ResponseType(typeof(HttpResponseMessage))]
 [EnableCors(origins: "*", headers: "*", methods: "POST")]
 public HttpResponseMessage GetDeviceSettings([FromBody] string tenantid)
 {
   MessageReceiver.Instance.InitiateRequest(requestParms[0], tenantid);
 }

此控制器方法将启动订阅客户端的OnMessage请求

RtmSubsCriptionClient().OnMessage((msg) =>
{
 SendRtmTopicMessage(msg, tenantid);
 msg.CompleteAsync();
}

我面临的挑战

1:我必须在onMessage中传递GroupName(tenantid)才能找到Client。

2:GC将为OnMessage方法配置调用者对象,因为它来自Controller Method,并且在响应之后它没有任何生活对象范围[怀疑]。

3:多个帖子后方法调用将触发多个OnMessage请求,这将导致异常 OnMessage方法已在消息上调用

One WorkAround,但不要认为这会起作用。

Task RealTimetask=new Task(async () => await   RecieveRealTimeBrokeredMessage(tenantid));

if (RealTimetask.IsCompleted)  RealTimetask.Start();

4:如果我在后台线程中运行OnMessage,如何找到我必须发送消息的客户端,因为GroupName不在此范围内。

0 个答案:

没有答案