SIGNALR:$.connection.hub.start() 结果为 "Error parsing negotiate response."
SIGNALR: $.connection.hub.start() results in "Error parsing negotiate response."
我最近在我的 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 用于建立 hub/connection:
$(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] 将服务器端集线器代码剥离为空的 class,以确保其中没有任何内容导致问题。我在 Startup.cs 中调用了 app.MapSignalR() 。我的第一个想法是,由于这是在上架和取消上架之后发生的,所以我的第一个想法是有些东西没有进入货架而丢失了,但我似乎找不到任何丢失的东西......
有人有什么想法吗?
我在玩 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"/>
...我以前不知道这是怎么回事。
我最近在我的 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 用于建立 hub/connection:
$(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] 将服务器端集线器代码剥离为空的 class,以确保其中没有任何内容导致问题。我在 Startup.cs 中调用了 app.MapSignalR() 。我的第一个想法是,由于这是在上架和取消上架之后发生的,所以我的第一个想法是有些东西没有进入货架而丢失了,但我似乎找不到任何丢失的东西......
有人有什么想法吗?
我在玩 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"/>
...我以前不知道这是怎么回事。