繁体   English   中英

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

[英]Self hosted cross site connection issue with SignalR and Mono and 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类正在为所有请求(包括connect请求)添加Access-Control-Allow-Origin标头。 因此,它应该可以正常工作。


编辑2:因此实际上,由于curl,服务器似乎返回了500响应代码,并且由于它还不包含标头(这一定是在我添加了日志记录的代码块之后发生的),Chrome抱怨跨站点,当确实在服务器的某个地方可能抛出异常时。 希望我很快能解决这个问题,并在这里发布答案。

因此,事实证明,这与跨站点访问无关,而与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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM