【发布时间】:2015-08-05 21:39:52
【问题描述】:
我只是想让 SignalR 设置运行 owin 托管,我想通过 JavaScript 客户端进行连接。应该很容易吧?我能够快速设置并运行 SignalR 服务器以及连接到服务器的客户端。但是,当在客户端调用 done 回调时,我尝试调用集线器的 Send 方法,并在控制台中收到以下错误:
XMLHttpRequest 无法加载 http://localhost:8199/signalr/signalr/send?transport=serverSentEvents&clien...AxBg6iaFwlK50s2DnurE&connectionData=%5B%7B%22name%22%3A%22testhub%22%7D%5D。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'http://localhost' 不允许访问。响应的 HTTP 状态代码为 500。
这是我的服务器端代码:
public static IAppBuilder UseService(this IAppBuilder app)
{
log4net.Config.XmlConfigurator.Configure();
app.UseService(NinjectConfig.CreateKernel);
app.UseLogging();
app.UseSignalr();
return app;
}
internal static IAppBuilder UseSignalr(this IAppBuilder app)
{
app.Map("/signalr", map =>
{
map.UseCors(CorsOptions.AllowAll);
var hubConfig = new HubConfiguration {EnableDetailedErrors = true};
map.RunSignalR(hubConfig);
}
);
return app;
}
这里是客户端:
var connection = $.hubConnection('http://localhost:8199/signalr');
var testHub = connection.createHubProxy('testHub');
testHub.on('addMessage', function(name){
console.log(name);
});
connection.start().done(function () {
testHub.invoke('send', 'testName');
}).fail(function (e) {
console.log('Failed to connect');
});
connection.error(function(error){
console.log(error);
});
为什么 CORS 请求适用于 start 调用而不是后续的 hub 方法调用?
更新: 在网络选项卡中,我可以看到有一个呼叫:http://localhost8199/signalr/negotiate - 此呼叫有效,CORS 标头按预期响应响应
然后调用:http://localhost:8199/signalr/connect 并且该调用也具有正确的 CORS 标头并且可以正常工作。
然后调用:http://localhost:8199/signalr/start 同样的好事发生在这里。
最后有一个调用:http://localhost:8199/signalr/send,这是失败的调用,每个失败消息都有零个 CORS 标头。
更新:
我也试过这样设置我的客户端:
$.connection.hub.url = 'http://localhost:8199/signalr';
var proxy = $.connection.testHub;
proxy.client.addMessage = function(name){
console.log(name);
};
$.connection.hub.start()
.done(function () {
console.log($.connection.hub.id);
proxy.server.sendMessage()
.done(function(val){
console.log(val);
});
})
.fail(function (e) {
console.log('Failed to connect');
});
我对这项工作的希望不大,因为我觉得问题出在服务器端。但只是想更新我在这里尝试过的内容。
【问题讨论】:
标签: signalr