我们正在尝试将主题消息发送给曾经请求过的尊贵连接客户端。集线器托管在具有持久连接的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不在此范围内。