C# 在SignalR项目外部调用客户端方法

C# 在SignalR项目外部调用客户端方法,c#,.net,winforms,signalr,signalr.client,C#,.net,Winforms,Signalr,Signalr.client,我担心在以下场景中如何使用SgnalR: 有一个非集线器服务项目定期运行耗时的任务。 应将正在运行的任务的进度通知客户端。在做了一些研究之后,Signal似乎是这个目的的正确选择 问题是,我希望服务中心客户端系统尽可能松散耦合。因此,我在IIS中托管了Hub,正如SignalR文档所示,在外部项目中添加了对Hub上下文的引用,并将其称为客户端方法: hubContext = GlobalHost.ConnectionManager.GetHubContext<TheHub>(

我担心在以下场景中如何使用SgnalR:

有一个非集线器服务项目定期运行耗时的任务。 应将正在运行的任务的进度通知客户端。在做了一些研究之后,Signal似乎是这个目的的正确选择

问题是,我希望服务中心客户端系统尽可能松散耦合。因此,我在IIS中托管了Hub,正如SignalR文档所示,在外部项目中添加了对Hub上下文的引用,并将其称为客户端方法:

    hubContext = GlobalHost.ConnectionManager.GetHubContext<TheHub>()
    hubContext.Clients.All.progress(n, i);
hubContext=GlobalHost.ConnectionManager.GetHubContext()
hubContext.Clients.All.progress(n,i);
客户端:

    private void InitHub()
    {
        hubConnection = new HubConnection(ConfigurationManager.AppSettings["hubConnection"]);

        hubProxy = hubConnection.CreateHubProxy("TheHub");
        hubConnection.Start().Wait();
    }

    hubProxy.On<int, int>("progress", (total, done) =>
        {
            task1Bar.Invoke(t => t.Maximum = total);
            task1Bar.Invoke(t => t.Value = done);
        });
private void InitHub()
{
hubConnection=新的hubConnection(ConfigurationManager.AppSettings[“hubConnection”]);
hubProxy=hubConnection.CreateHubProxy(“TheHub”);
hubConnection.Start().Wait();
}
hubProxy.On(“进度”、(总计、完成)=>
{
task1Bar.Invoke(t=>t.Maximum=total);
task1Bar.Invoke(t=>t.Value=done);
});

在客户端,该方法没有被调用,经过两天的研究,我无法让它工作,尽管当从中心本身进行调用时,它工作得很好。我怀疑我缺少一些配置

如果调用方是Web项目以外的任何项目,则无法在中心类或服务中使用GlobalHost.Connection manager

GlobalHost.ConnectionManager.GetHubContext<TheHub>()
最后一位是集线器本身,应该类似于:

public void NotifyGroup(string groupName, string message)
{
  var group = Clients.Group(groupName);
  if (group == null)
  {
    Log.IfWarn(() => $"Group '{groupName}' is not registered");
    return;
  }
  group.NotifyGroup(message);
}

您能否向我们展示一些有关如何创建
HubConnection
IHubProxy
你好,Michael。我在上面添加了代码,正常情况下应该可以。检查
n
i
是否都是
int
类型。此外,在
hub
中重载
任务OnConnected
方法,如果在
hubConnection.Start()之后制动点被击中,则通过添加断点进行检查。我已经检查过这一点,断点在OnConnected中以及在我添加到hub类的任何其他方法中被击中。在Hub项目之外尝试执行相同操作时会出现问题。通常情况下,这应该是可行的。另外一个问题可能是,如果您处理上的
返回的
IDisposable
public void NotifyGroup(string groupName, string message)
{
  var group = Clients.Group(groupName);
  if (group == null)
  {
    Log.IfWarn(() => $"Group '{groupName}' is not registered");
    return;
  }
  group.NotifyGroup(message);
}