asp.net SignalR -如何从服务器调用服务器上的Hub方法

798qvoo8  于 2023-01-14  发布在  .NET
关注(0)|答案(1)|浏览(252)

我让SignalR在ASP.NET(以前是MVC)服务器和Windows服务客户端之间工作,客户端可以调用服务器集线器上的方法,然后显示给浏览器。

public class AlphaHub : Hub
{
    public void Hello(string message)
    {
       // We got the string from the Windows Service 
       // using SignalR. Now need to send to the clients
       Clients.All.addNewMessageToPage(message);
       // Call Windows Service
       string message1 = System.Environment.MachineName;
       Clients.All.Notify(message1);
   }
   public void CallForReport(string reportName)
   {
       Clients.All.CallForReport(reportName);
   }
}

在客户端(Windows服务)上,我一直在调用Hub上的方法:

var hubConnection = new HubConnection("http://localhost/AlphaFrontEndService/signalr",
                    useDefaultUrl: false);

IHubProxy alphaProxy = hubConnection.CreateHubProxy("AlphaHub");
await hubConnection.Start();
string cid = hubConnection.ConnectionId.ToString();
eventLog1.WriteEntry("ConnectionID: " + cid);

// Invoke method on hub
await alphaProxy.Invoke("Hello", "Message from Service - ConnectionID: " + cid + " - " + System.Environment.MachineName.ToString() + " " + DateTime.Now.ToString());

现在,假设这个场景:用户将转到服务器上的特定ASP.NET表单,如Insured.aspx,在此我想调用CallForReport,然后在客户端调用以下方法:

public void CallFromReport(string reportName)
{
    eventLog1.WriteEntry(reportName);
}

如何连接到服务器上我自己的Hub并调用该方法?我从Insured.aspx尝试了以下方法:

protected void Page_Load(object sender, EventArgs e)
{
    // Hubs.AlphaHub.CallForReport("Insured Report");
    // IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<AlphaHub>();
    // hubContext.Clients.All.CallForReport("Insured Report");
}
yduiuuwa

yduiuuwa1#

我没有看到任何对IHubProxy.On的调用。这是您需要将CallFromReport方法连接到客户端上的AlphaHub IHubProxy的方法。

var hubConnection = new HubConnection("http://localhost/AlphaFrontEndService/");
 IHubProxy alphaProxy = hubConnection.CreateHubProxy("AlphaHub");

 alphaProxy.On<string>("CallForReport", CallFromReport);

 await hubConnection.Start();

 // ...

一旦你有了这些,你在Page_Load中注解的最后两行应该可以用了。

protected void Page_Load(object sender, EventArgs e)
{
    IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<AlphaHub>();
    hubContext.Clients.All.CallForReport("Insured Report");
}

相关问题