在 SignalR Hub 中引用另一个 project/winform
Give a reference to another project/winform in SignalR Hub
我正在研究 SignalR For Winforms 官方示例。他们处理 UI 交互的方式是使用 Program
instance/reference,您可以在下面的代码中看到:
public class MyHub : Hub
{
public void Send(string name, string message)
{
Clients.All.addMessage(name, message);
}
public override Task OnConnected()
{
//here they used Program....
Program.MainForm.WriteToConsole("Client connected: " + Context.ConnectionId);
return base.OnConnected();
}
public override Task OnDisconnected(bool graceFull)
{
Program.MainForm.WriteToConsole("Client disconnected: " + Context.ConnectionId);
return base.OnDisconnected(graceFull);
}
}
我的问题是,我在 Visual Studio 中创建了一个空解决方案并添加了 2 个项目,一个是 WinForms 项目,另一个是 class 库。
显然,我无法在 MyHub
class 中的 WinForms 项目中提供 Program
参考,该项目位于 class 库项目中,因为据我所知Hub
或 MyHub
class 不应实例化...它只是为了反射而存在。
有没有一种方法可以将我的 winforms 的引用静态地传递给 MyHub
class?
好的,我只是通过添加一个静态字段(一个由 Form
:
实现的接口来解决
public class MyHub : Hub
{
public static ICommunicationOwner Owner;
public void Send(string name, string message)
{
Clients.All.addMessage(name, message);
}
public override Task OnConnected()
{
Owner.GetData("Client connected: ", Context.ConnectionId);
return base.OnConnected();
}
public override Task OnDisconnected(bool graceFull)
{
Owner.GetData("Client disconnected: ", Context.ConnectionId);
return base.OnDisconnected(graceFull);
}
}
在服务器中 class 我是这样的:
public void StartServer()
{
MyHub.Owner = _owner;
try
{
SignalR = WebApp.Start(_serverUri);
}
catch (TargetInvocationException e)
{
_isServerStarted = false;
_owner.GetData("Connection", "Error starting server: " + e.Message);
return;
}
catch (Exception e)
{
_isServerStarted = false;
_owner.GetData("Connection", "Error starting server: " + e.Message);
return;
}
_owner.GetData("Connection", "Successful");
_isServerStarted = true;
}
或者我强烈推荐使用 SignalR Self-Host.This 机制,这对你很有帮助。这是一个循序渐进的教程:
这个机制是这样工作的:你正在创建一个信号主机,它就像将数据推送到特定端口。这个主机可以是控制台应用程序,asp.net mvc 应用程序或 winform 等。然后其他项目或 class 库将是客户端(Signalr 有包 'SignalR Javascript Client' 和 'SignalR .NET Client')
. Web 应用程序将消息作为 javascript 客户端,其他应用程序(如 winforms 或控制台)将消息作为 .net 客户端。这种机制是真正可伸缩和可扩展的。
我正在研究 SignalR For Winforms 官方示例。他们处理 UI 交互的方式是使用 Program
instance/reference,您可以在下面的代码中看到:
public class MyHub : Hub
{
public void Send(string name, string message)
{
Clients.All.addMessage(name, message);
}
public override Task OnConnected()
{
//here they used Program....
Program.MainForm.WriteToConsole("Client connected: " + Context.ConnectionId);
return base.OnConnected();
}
public override Task OnDisconnected(bool graceFull)
{
Program.MainForm.WriteToConsole("Client disconnected: " + Context.ConnectionId);
return base.OnDisconnected(graceFull);
}
}
我的问题是,我在 Visual Studio 中创建了一个空解决方案并添加了 2 个项目,一个是 WinForms 项目,另一个是 class 库。
显然,我无法在 MyHub
class 中的 WinForms 项目中提供 Program
参考,该项目位于 class 库项目中,因为据我所知Hub
或 MyHub
class 不应实例化...它只是为了反射而存在。
有没有一种方法可以将我的 winforms 的引用静态地传递给 MyHub
class?
好的,我只是通过添加一个静态字段(一个由 Form
:
public class MyHub : Hub
{
public static ICommunicationOwner Owner;
public void Send(string name, string message)
{
Clients.All.addMessage(name, message);
}
public override Task OnConnected()
{
Owner.GetData("Client connected: ", Context.ConnectionId);
return base.OnConnected();
}
public override Task OnDisconnected(bool graceFull)
{
Owner.GetData("Client disconnected: ", Context.ConnectionId);
return base.OnDisconnected(graceFull);
}
}
在服务器中 class 我是这样的:
public void StartServer()
{
MyHub.Owner = _owner;
try
{
SignalR = WebApp.Start(_serverUri);
}
catch (TargetInvocationException e)
{
_isServerStarted = false;
_owner.GetData("Connection", "Error starting server: " + e.Message);
return;
}
catch (Exception e)
{
_isServerStarted = false;
_owner.GetData("Connection", "Error starting server: " + e.Message);
return;
}
_owner.GetData("Connection", "Successful");
_isServerStarted = true;
}
或者我强烈推荐使用 SignalR Self-Host.This 机制,这对你很有帮助。这是一个循序渐进的教程:
这个机制是这样工作的:你正在创建一个信号主机,它就像将数据推送到特定端口。这个主机可以是控制台应用程序,asp.net mvc 应用程序或 winform 等。然后其他项目或 class 库将是客户端(Signalr 有包 'SignalR Javascript Client' 和 'SignalR .NET Client') . Web 应用程序将消息作为 javascript 客户端,其他应用程序(如 winforms 或控制台)将消息作为 .net 客户端。这种机制是真正可伸缩和可扩展的。