C# 从信号集线器到特定客户端的Servicebus主题消息

C# 从信号集线器到特定客户端的Servicebus主题消息,c#,asp.net-web-api,signalr,servicebus,C#,Asp.net Web Api,Signalr,Servicebus,我们正在尝试将主题消息发送给曾经请求此主题的杰出连接客户。中心托管在具有持久连接的WebRole内 目前实施的方法是 1:客户端必须发出一个订阅组的初始请求,在此之后,它不会对服务器方法进行任何调用,但会等待来自服务器的消息 ///Tenantid-fix KnownIDToClient [HubMethodName("subscribe")] public async Task Subscribe(string tenantid) { if (!string.IsNullOrWhiteSp

我们正在尝试将主题消息发送给曾经请求此主题的杰出连接客户。中心托管在具有持久连接的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请求,用于在subscribe方法调用之后启动Subscription客户端的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)才能找到客户机

2:GC将处理OnMessage方法的调用方对象,因为它源于控制器方法,并且在响应之后,它不具有任何活动对象的范围[怀疑]

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

一个解决办法,但不要认为这是可行的

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

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

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

有问题吗?我不完全了解应用程序中的所有内容是如何联系在一起的,但我怀疑你在OnMessage循环中存在范围问题。对找到的每条消息调用回调,并在客户端打开时继续运行。在我回答之前,有几个问题:谁创建/持有订阅客户端?MSG在sub中是否只针对一个客户端?有问题吗?我不完全了解应用程序中的内容是如何结合在一起的,但我怀疑您在OnMessage循环中存在范围界定问题。对找到的每条消息调用回调,并在客户端打开时继续运行。在我回答之前,有几个问题:谁创建/持有订阅客户端?子系统中的MSG是否只针对一个客户?