与SignalR,Mono和Owin自托管跨站点连接问题

时间:2013-05-16 01:38:58

标签: mono signalr signalr-hub owin

我准备好解决这个问题,因为所有的指南都显示了相同的一两个解决方案,除了我自己以外,似乎对所有人都有效。

我在使用Owin的Mono应用程序中使用SignalR。我在HubConfiguration中设置了EnableCrossDomain = true。我已经使用javascript建立了一个简单的测试页面来连接。 negotiateping网址加载时没有问题,似乎正确回复。但是,我在connect电话上收到了跨域错误。

它肯定使用我的EnableCrossDomain设置,因为如果我将其设置为false,negotiate不起作用。

这是我的Javascript连接(是的,我包括/ signalr / hubs脚本,它返回相应的javascript):

$.connection.hub.url = 'http://localhost:7001/signalr';
$.connection.hub.logging = true;
$.connection.hub.start()
    .done(function () { alert("Now connected!"); })
    .fail(function () { alert("Could not Connect!"); });

此外,我也尝试了jQuery.support.cors = true;,但它没有任何区别。

我也试过连接到这样的常规PersistantConnection,遇到同样的问题,所以它似乎与集线器没有直接关系:

var connection = $.connection('/raw');
connection.url = 'http://localhost:7001/signalr';
connection.start()
    .done(function () { alert("Now connected!"); })
    .fail(function () { alert("Could not Connect!"); });

我在这里做错了什么?为什么pingnegotiate有效但connect无效?


编辑:为了使问题更加棘手,我添加了一些日志记录并验证SignalR CallHandler类是否为所有请求添加了Access-Control-Allow-Origin标头,包括connect请求。所以应该有效。


编辑2:所以实际上感谢curl看起来服务器返回500响应代码,因为它不包括标题(这必须在我添加日志的代码块之后发生),Chrome抱怨跨站点,当真的有可能在服务器的某个地方抛出异常。希望我很快就能解决这个问题并在此发表答案。

1 个答案:

答案 0 :(得分:1)

所以它实际上与跨站点访问无关,而且与Mono不兼容性有关。

我为SignalR(https://stackoverflow.com/a/16577890/299262)启用了异常日志记录后,我得到了以下异常,而不仅仅是一个空白的http 500错误:

System.InvalidOperationException: The connection id is in the incorrect format.
  at Microsoft.AspNet.SignalR.PersistentConnection.GetConnectionId (Microsoft.AspNet.SignalR.Hosting.HostContext context, System.String connectionToken) [0x00000] in <filename unknown>:0 
  at Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest (Microsoft.AspNet.SignalR.Hosting.HostContext context) [0x00000] in <filename unknown>:0 
  at Microsoft.AspNet.SignalR.Hubs.HubDispatcher.ProcessRequest (Microsoft.AspNet.SignalR.Hosting.HostContext context) [0x00000] in <filename unknown>:0 
  at Microsoft.AspNet.SignalR.Owin.CallHandler.Invoke (IDictionary`2 environment) [0x00000] in <filename unknown>:0 
  at Microsoft.AspNet.SignalR.Owin.Handlers.HubDispatcherHandler.Invoke (IDictionary`2 environment) [0x00000] in <filename unknown>:0 
  at Microsoft.AspNet.SignalR.Owin.Handlers.PersistentConnectionHandler.Invoke (IDictionary`2 environment) [0x00000] in <filename unknown>:0 
  at Microsoft.Owin.Diagnostics.ShowExceptionsMiddleware.Invoke (IDictionary`2 environment) [0x00000] in <filename unknown>

这导致我在SignalR回购问题列表中找到了这张票:https://github.com/SignalR/SignalR/issues/1914

所以最后,修复是在HostDependencyResolverExtensions.cs中注释掉以下行:

resolver.InitializePerformanceCounters(instanceName, hostShutdownToken);