【问题标题】:Self hosted cross site connection issue with SignalR and Mono and OwinSignalR 和 Mono 和 Owin 的自托管跨站点连接问题
【发布时间】:2013-05-10 18:30:57
【问题描述】:

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

我在 Mono 应用程序中使用 SignalR,使用 Owin。我在 HubConfiguration 中设置了 EnableCrossDomain = true。我已经设置了一个使用 javascript 进行连接的简单测试页面。 negotiate 和 ping url 加载没有问题,似乎回复正确。但是,我在 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!"); });

我在这里做错了什么?为什么ping 和negotiate 有效,而connect 无效?


编辑:为了让事情变得更奇怪,我添加了一些日志记录并验证 SignalR CallHandler 类正在为所有请求添加 Access-Control-Allow-Origin 标头,包括 connect 请求。所以它应该可以工作。


编辑 2:实际上,多亏了 curl,它看起来服务器正在返回一个 500 响应代码,并且由于它不包括标题(这必须在我添加日志记录的代码块之后发生),Chrome 抱怨跨站点,当真的在服务器的某个地方抛出异常时。希望我能尽快解决这个问题,并在此处发布答案。

【问题讨论】:

    标签: mono signalr signalr-hub owin


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2013-07-09
      • 2013-07-03
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 2017-10-31
      • 2015-12-16
      相关资源
      最近更新 更多