Javascript 从SignalR2到phantomjs的跨域

Javascript 从SignalR2到phantomjs的跨域,javascript,signalr,phantomjs,Javascript,Signalr,Phantomjs,本项目在SignalR v1.1.4上正常工作,客户机为phantomjs和cors: webpage = require "webpage" websocket = webpage.create() serverUrl = "http://www.domain.com" websocket.injectJs './jquery-2.1.0.min.js' websocket.injectJs './jquery.signalR-1.1.4.min.js' websocket.includeJs

本项目在SignalR v1.1.4上正常工作,客户机为phantomjs和cors:

webpage = require "webpage"
websocket = webpage.create()
serverUrl = "http://www.domain.com"
websocket.injectJs './jquery-2.1.0.min.js'
websocket.injectJs './jquery.signalR-1.1.4.min.js'
websocket.includeJs serverUrl + '/signalr/hubs', ->
    websocket.evaluate (serverUrl)->
        $.support.cors = false
        $.connection.hub.url = serverUrl + '/signalr'
        taskHub = $.connection.taskHub
        $.connection.hub.start().done ->
            taskHub.server.registerAgent "xxx"
            #……
        taskHub.client.castTesk = (task) ->
            #……
    , serverUrl
直到将SignalR升级到v2.0.2。 我在应用程序_Start()上删除RouteTable.Routes.MapHubs(新的HubConfiguration(){EnableCrossDomain=true}),并添加Startup.cs:

[assembly: OwinStartup(typeof(SpiderMan.Startup))]
namespace ProjectNamespace {
    public partial class Startup {
        public void Configuration(IAppBuilder app) {
            app.Map("/signalr", map => {
                map.UseCors(CorsOptions.AllowAll);
                var hubConfiguration = new HubConfiguration {
                    EnableJSONP = true
                };
                map.RunSignalR(hubConfiguration);
            });
        }
    }
}
然后,$.connection.hub.start()将始终正常工作,但无法触发taskHub.client.castTesk(),且不会显示任何错误消息

更新: v1.2.1与v2.0.2一样,也是工作失败。
而且,服务器上任何版本的Microsoft.AspNet.signar包都不会影响此问题。对于任何服务器信号器版本,客户端使用jquery.signalR-1.1.4.min.js都可以正常工作,使用jquery.signalR-1.2.1.min.js总是失败。

在开始连接之前,您应该定义castTesk方法。此问题将在的“在添加订阅之前启动连接”部分中讨论

问题是,如果在定义
taskHub.client.castTesk
之前调用
$.connection.hub.start()
,SignalR将不会向taskHub订阅客户端

您仍然可以调用属于TaskHub的服务器端方法,如RegisterAgent,但服务器将无法调用客户端方法,如castTesk


我还建议删除
$.support.cors=false
行。这将导致Signar始终使用JSONP而不是CORS,即使浏览器支持CORS。

尝试启用客户端日志记录:这将为您提供更多诊断信息,您可以将其添加到问题中。谢谢您的建议。我启用了日志,最后一行信息是“调用taskhub.RegisterAgent”,无错误无警告
#……
taskHub.client.castTesk = (task) ->
    #……
$.connection.hub.start().done ->
    taskHub.server.registerAgent "xxx"
    #……