我正在尝试从 .net Web API 控制器操作中调用客户端方法。
我能做到吗?
我找到的唯一接近我所要做的事情的帖子是这个:
SignalR + posting a message to a Hub via an action method
在那里,使用 GlobalHost.ConnectionManager.GetHubContext 在 asp.net MVC 控制器动作中发送了一条消息。
当我在我的 Web API 动作中尝试时,不会抛出任何错误,但是客户端上的“methodInJavascript”方法从未被调用。
Public ActionResult MyControllerMethod()
{
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.methodInJavascript("hello world");
// or
context.Clients.Group("groupname").methodInJavascript("hello world");
}
当我在该操作内设置断点时,我可以看到代码被执行,但JavaScript客户端没有任何反应。为什么?Web API在内部是如此不同以至于这不起作用吗?有人尝试过并成功了吗?
当我从我的Hub“内部”调用“methodInJavascript”时,它完美地工作。只有在从.NET Web API控制器操作中调用时才无法工作。
更新:
经过研究,我没有解决方案。我只能假设像这个ASP.NET MVC 4 中使用 SignalR 时服务器到客户端消息无法传递以及这个从WebAPI控制器调用SignalR Hub问题这样的示例中缺少某些东西,例如启用从HubContext调用的其他配置步骤等。我最初发布的代码与这些示例中的代码类似,并没有被证明存在任何缺陷。从html中调用有效。我在我的应用程序中广泛使用它,并且从未遇到过问题。我从来没有见过来自API控制器的HubContext的调用起作用。没有错误,只是客户端没有结果。
已解决(有点):
上面的代码确实可以直接使用,但只有在发布后才有效。但在Visual Studio开发环境通过localhost不起作用。没有错误,但客户端端没有结果。将代码按原样发布到Web上的真实服务器中确实有效。我从未想过会有区别,所以我从未尝试过。我认为如果在本地无法工作,则不会发布。现在它正在实时工作,但我想知道为什么它在开发环境中的localhost上不起作用。无法使用断点等在本地测试。
我感觉是signalr虚拟目录。当本地运行和发布时,有些不同。不确定是什么,但我看到很多类似的帖子,例如http://www.bitwisejourneys.com/signalr-hosting-in-iis-a-nasty-gotcha/。现在正在阅读,以了解是否有方法使其在本地和发布时都能工作。