【发布时间】:2016-02-18 11:30:05
【问题描述】:
我正在学习 SignalR。使用教程,我设法创建了一个非常简单的基于 ASP.NET MVC 的 SignalR 服务器。这是集线器的代码:
[HubName("echo")]
public class EchoHub : Hub
{
public void Say(string message)
{
Trace.WriteLine(message);
}
}
这是我的启动文件:
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Map("/signalr", map =>
{
map.UseCors(CorsOptions.AllowAll);
var hubConfiguration = new HubConfiguration
{
EnableJSONP = true
};
map.RunSignalR(hubConfiguration);
});
}
}
接下来我创建了一个基于 HTML/JavaScript 的客户端,它与服务器代码在同一个项目中。此客户端工作正常,当我调试应用程序时,输出窗口会显示我的消息。这是第一个客户的代码:
<script src="../Scripts/jquery-1.10.2.min.js"></script>
<script src="../Scripts/jquery.signalR-2.1.2.min.js"></script>
<script src="/signalr/hubs"></script>
<script>
$(function() {
var hubProxy = $.connection.echo;
$.connection.hub.logging = true;
$.connection.hub
.start()
.done(function () {
hubProxy.server.say('Hello SignalR');
});
})
</script>
我想做的最后一件事是在单独的项目中创建一个客户端。我更改了一点代码,主要是通过添加服务器的 url。但是这个客户端不能正常工作。这是客户端的代码:
<script src="Scripts/jquery-1.6.4.min.js"></script>
<script src="Scripts/jquery.signalR-2.2.0.min.js"></script>
<script src="http://localhost:51644/signalr/hubs"></script>
<script>
$(function() {
$.connection.hub.url = 'http://localhost:51644/signalr';
var hubProxy = $.connection.echo;
$.connection.hub.logging = true;
$.connection.hub
.start()
.done(function () {
hubProxy.server.say('Hello SignalR');
});
})
</script>
启动连接后,JavaScript 甚至不会在 done 方法中输入函数。但在 Chrome 的控制台中,没有抛出任何错误或异常。
所以问题是我在第二个客户端做错了什么?
编辑:我在 Chrome 控制台中启用并检查了 SignalR 客户端日志。第二个客户端停止步骤“SignalR:与'/signalr/negotiate?clientProtocol=1.4&connectionData=%5B%5D'协商”。没有返回任何错误,一切看起来都很好,但是客户端无法通过这一步。
EDIT2:根据 JF Beaulieu 的评论,协商返回 200 状态码,但没有别的。在协商之后应该有接下来的步骤,比如调用 Say,但在外部客户端挂起协商。我在此处粘贴来自内置和外部 JavaScript 客户端的控制台输出。
构建客户端输出:
外部客户端输出:
第二个屏幕截图显示,客户端停止执行协商步骤。
我也尝试过Mareq的解决方案,但是添加jsonp属性并没有帮助。
EDIT3:我在这里添加了一个指向我的 Github 存储库的链接,该项目的服务器位于 AspNetServer 项目中,客户端位于 JavaScriptClient 项目中,希望对您有所帮助: https://github.com/RomanSuska/SignalRSandbox
【问题讨论】:
-
如果你访问
http://localhost:51644/signalr/hubs,你会看到一些生成的javascript吗? -
@JFBeaulieu 是的,我看到生成的 JavaScript 代码,来自第一个和第二个客户端的文件是相等的。
-
您使用什么传输方式连接?你能在开发工具的网络选项卡中看到
200 OK用于协商...消息吗? -
我已更新问题以回答您的评论。