Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 使用控制器中的集线器方法?_Asp.net_Asp.net Mvc_Signalr_Signalr Hub - Fatal编程技术网

Asp.net 使用控制器中的集线器方法?

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

我使用的是信号器2,我不知道如何使用集线器方法,例如从控制器动作内部

我知道我可以做到以下几点:

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方法。实际的客户端并不关心这一点,那么他为什么要发布该消息呢?我做了类似的事情,我有客户端和管理员(特殊客户端),管理员发送命令并等待客户端的响应,为此,我在中心上创建了一个管理员和客户端列表,管理员选择了一个客户端,保留它,以便其他管理员不使用它,然后发送命令,集线器将其转发给客户端,客户端将响应返回给集线器,然后将响应转发给管理员并打印在屏幕上