Asp.net 使用控制器中的集线器方法?
我使用的是信号器2,我不知道如何使用集线器方法,例如从控制器动作内部 我知道我可以做到以下几点:Asp.net 使用控制器中的集线器方法?,asp.net,asp.net-mvc,signalr,signalr-hub,Asp.net,Asp.net Mvc,Signalr,Signalr Hub,我使用的是信号器2,我不知道如何使用集线器方法,例如从控制器动作内部 我知道我可以做到以下几点: var hub = GlobalHost.ConnectionManager.GetHubContext<T>(); hub.Clients.All.clientSideMethod(param); /// <summary>Tells the clients that some item has changed.</summary> public async
var hub = GlobalHost.ConnectionManager.GetHubContext<T>();
hub.Clients.All.clientSideMethod(param);
/// <summary>Tells the clients that some item has changed.</summary>
public async Task ItemHasChangedFromClient()
{
await ItemHasChangedAsync().ConfigureAwait(false);
}
/// <summary>Tells the clients that some item has changed.</summary>
public static async Task ItemHasChangedAsync()
{
// my custom logic
await HubContext.Clients.All.itemHasChanged();
}
在访问客户端时,我会遇到一个“不通过集线器管道创建集线器不受支持”异常。创建一个“帮助器”类可能会起作用,该类实现您的业务规则,并由集线器和控制器调用:
public class MyHub : Hub
{
public void DoSomething()
{
var helper = new HubHelper(this);
helper.DoStuff("hub stuff");
}
}
public class MyController : Controller
{
public ActionResult Something()
{
var hub = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
var helper = new HubHelper(hub);
helper.DoStuff("controller stuff");
}
}
public class HubHelper
{
private IHubConnectionContext hub;
public HubHelper(IHubConnectionContext hub)
{
this.hub = hub;
}
public DoStuff(string param)
{
//business rules ...
hub.Clients.All.clientSideMethod(param);
}
}
公共类MyHub:Hub
{
公共无效剂量测定法()
{
var helper=新的HubHelper(此);
helper.DoStuff(“枢纽材料”);
}
}
公共类MyController:Controller
{
公共行动结果某事
{
var hub=GlobalHost.ConnectionManager.GetHubContext();
var helper=新的HubHelper(hub);
helper.DoStuff(“控制器材料”);
}
}
公共类HubHelper
{
专用IHubConnectionContext中心;
公共HubHelper(IHubConnectionContext hub)
{
this.hub=hub;
}
公共DoStuff(字符串参数)
{
//商业规则。。。
hub.Clients.All.clientSideMethod(param);
}
}
由于我没有找到“好的解决方案”,我正在使用@michael.rp的解决方案,并进行了一些改进:
我确实创建了以下基类:
public abstract class Hub<T> : Hub where T : Hub
{
private static IHubContext hubContext;
/// <summary>Gets the hub context.</summary>
/// <value>The hub context.</value>
public static IHubContext HubContext
{
get
{
if (hubContext == null)
hubContext = GlobalHost.ConnectionManager.GetHubContext<T>();
return hubContext;
}
}
}
公共抽象类Hub:Hub,其中T:Hub
{
私有静态IHubContext-hubContext;
///获取中心上下文。
///中心上下文。
公共静态IHubContext HubContext
{
得到
{
if(hubContext==null)
hubContext=GlobalHost.ConnectionManager.GetHubContext();
返回上下文;
}
}
}
然后在实际的Hub(例如,公共类AdminHub:Hub
)中,我有如下(静态)方法:
var hub = GlobalHost.ConnectionManager.GetHubContext<T>();
hub.Clients.All.clientSideMethod(param);
/// <summary>Tells the clients that some item has changed.</summary>
public async Task ItemHasChangedFromClient()
{
await ItemHasChangedAsync().ConfigureAwait(false);
}
/// <summary>Tells the clients that some item has changed.</summary>
public static async Task ItemHasChangedAsync()
{
// my custom logic
await HubContext.Clients.All.itemHasChanged();
}
///告诉客户端某些项已更改。
公共异步任务项hasChangedFromClient()
{
wait ItemHasChangedAsync().ConfigureWait(false);
}
///告诉客户端某些项目已更改。
公共静态异步任务ItemHasChangedAsync()
{
//我的自定义逻辑
等待HubContext.Clients.All.itemHasChanged();
}
+1因为它已经是一种比我更好的方法,但我仍然希望能够“直接”使用Hub方法,因为它对我来说“更清晰”和“更容易理解”…@ChrFin您有没有找到从程序集中成功调用Hub方法的方法?如果无法调用中心实例,此选项似乎是最干燥和最分隔的。@BrandonWittwer:不,不是真的。我只是没有将答案标记为被接受,因为我仍然希望找到一个“本地解决方案”。我将在我目前的解决方案中添加一个答案……为什么不从客户端(我假设是JS)执行此操作呢?您可以执行Ajax请求并在服务器上执行您需要的操作controller@MEYWD:例如,因为我有一个管理界面,我想在“发生某些事情”时更新该界面。例如,客户端访问特定页面,因此我希望从该页面触发控制器操作中的hub方法。实际的客户端并不关心这一点,那么他为什么要发布该消息呢?我做了类似的事情,我有客户端和管理员(特殊客户端),管理员发送命令并等待客户端的响应,为此,我在中心上创建了一个管理员和客户端列表,管理员选择了一个客户端,保留它,以便其他管理员不使用它,然后发送命令,集线器将其转发给客户端,客户端将响应返回给集线器,然后将响应转发给管理员并打印在屏幕上