我最近在我的MVC5 / AngularJS应用程序中实现了基本的SignalR功能,但是在搁置和取消修改后,我现在在$ .connection.hub.start()中协商连接时出现错误。
我已经将代码简化为基础知识,但仍然会出现此错误。在jquery.signalR-2.2.0.js中进行协商请求,我发现从ajax请求返回到http://localhost:44379/signalr/negotiate?clientProtocol=1.5&connectionData=[]的结果是返回页面的HTML而不是JSON数据!
connection._.negotiateRequest = /* This is on line 659 */ signalR.transports._logic.ajax(connection, {
url: url, // http://localhost:44379/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%5D
error: function (error, statusText) {
// Irrelevant code removed.
},
success: function (result) { // We get here at least...
var res,
keepAliveData,
protocolError,
transports = [],
supportedTransports = [];
try {
res = connection._parseResponse(result); // This fails because result contains HTML.
} catch (error) {
// error.message is "Unexpected token <"
onFailed(signalR._.error(resources.errorParsingNegotiateResponse, error), connection);
return;
}
以下是我建立集线器/连接的javascript:
$(function () {
var hub = $.connection.testHub;
if (hub)
console.log("SignalR hub initialized.");
$.connection.hub.start().done(function () {
console.log("SignalR connection established.");
}).fail(function (err) {
console.log("Error starting SignalR connection: " + err); // Ends up here.
});
});
脚本引用(我将信号器代码放在名为messaging.js的单独的js文件中):
<script src="~/assets/js/signalr/jquery.signalR-2.2.0.js"></script>
<script src="~/Scripts/messaging/messaging.js"></script>
<script src="~/signalr/hubs"></script>
我真的不明白为什么来自signalr / negotiate的ajax响应会返回HTML而不是JSON。我已经使用[AllowAnonymous]将服务器端集线器代码剥离到空类,以确保没有任何内容导致问题。我在Startup.cs中调用了app.MapSignalR()。我的第一个想法是,因为这是在货架上和没有货架之后发生的,有些东西没有进入货架并且丢失了,但我似乎找不到任何遗漏......
有人有什么想法吗?
答案 0 :(得分:1)
我在使用web.config中的规则时发现了这个问题。 以前,我对信号器有这个规则:
<add input="{REQUEST_URI}" matchType="Pattern" pattern="/signalr/hubs" negate="true" />
更改模式允许与/ signalr / negotiate进行通信,我认为:
<add input="{REQUEST_URI}" matchType="Pattern" pattern="^/(signalr)" negate="true"/>
......我不知道之前是如何运作的。