【问题标题】:SignalR 500 errors during "ping" on Azure websiteAzure 网站上“ping”期间的 SignalR 500 错误
【发布时间】:2012-12-28 05:42:59
【问题描述】:

我有一个使用 SignalR 1.0.0-rc1 的 ASP.NET 4.5 Web 应用程序,我已将它推送到 Azure 网站以进行一些快速而简单的测试(我最感兴趣的是这里的这个页面: http://alantaappbeta.azurewebsites.net/api/v3.0/Tests/Sample.htm)。

问题在于页面似乎不想与 SignalR 服务通信。集线器和所有内容都已正确注册,因为 http://alantaappbeta.azurewebsites.net/signalr/hubs 返回正确的客户端集线器文件,并且对 /signalr/negotiate 的调用返回了一些看起来合理的 JSON。

{
  "Url":"/signalr",
  "ConnectionId":"a15023f9-c675-4fc2-9fd6-403a297f10c0",
  "KeepAlive":15.0,
  "DisconnectTimeout":40.0,
  "TryWebSockets":false,
  "WebSocketServerUrl":null,
  "ProtocolVersion":"1.1"
}

但是当它调用 /signalr/ping 时,它会返回 500 错误,并显示消息“协议错误:未知传输”。错误页面中返回的堆栈跟踪如下所示:

[InvalidOperationException]: Protocol error: Unknown transport.
at Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequestAsync(HostContext context)
at Microsoft.AspNet.SignalR.Hubs.HubDispatcher.ProcessRequestAsync(HostContext context)
at Microsoft.AspNet.SignalR.Owin.CallHandler.Invoke(IDictionary`2 environment)
at Microsoft.AspNet.SignalR.Owin.Handlers.HubDispatcherHandler.Invoke(IDictionary`2 environment)
at Microsoft.Owin.Host.SystemWeb.OwinCallContext.Execute()
at Microsoft.Owin.Host.SystemWeb.OwinHttpHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object extraData)
at Microsoft.Owin.Host.SystemWeb.OwinHttpHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

因为这是在 Azure 上,所以我无法访问您通常拥有的所有故障排除工具,但我能够访问的日志没有提供除上述之外的任何信息。

我想不用说这在我的本地 IIS 实例上运行良好:-)。

有什么建议吗?

编辑:这就是我打开连接的方式:

$.connection.hub.start({
    transport: 'auto',
    xdomain: true
}).done(function () {
    console.log('Connected with hub.id=' + $.connection.hub.id);
}).fail(function (e) {
    console.log('Unable to connect to SignalR Hubs: ' + e);
});

但是.done().fail() 处理程序都没有被调用。

奇怪的是,如果我将传输设置为“longPolling”,我可以在本地机器上使用 IIS Express 以类似的方式使其失败。但是我在 Azure 上设置的传输似乎没有任何区别:我仍然得到同样的错误。

【问题讨论】:

  • 你在使用 dev 分支吗?
  • 不,只是 NuGet 的 RC1 包。
  • ping 端点不在 RC1 版本中。
  • 抱歉,我不太明白。为什么我的客户打电话呢?为什么它只在 Azure 上做呢?而且(我应该提到这一点)为什么既没有调用 .done() 也没有调用 $.connection.hub.start() 的 .fail() 处理程序?
  • 没关系,想通了。我在服务器上使用了 RC1 位,但仍然以某种方式引用了 jquery.signalr.js 文件的 dev 分支版本。一旦我把它理顺了,一切都奏效了。感谢您的指点,很抱歉给您带来麻烦。

标签: azure signalr azure-web-app-service


【解决方案1】:

事实证明,问题在于我的机器上混合了不同版本的 SignalR:我使用的是 NuGet 包 (1.0.0-rc1) 中的服务器端 DLL,但 JavaScript 客户端文件是来自dev 分支。一旦我将它们全部同步,一切正常。我仍然不确定为什么这个问题只出现在 Azure 中,但我怀疑它与不同版本的 IIS 支持的精确传输有关。

【讨论】:

    猜你喜欢
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    相关资源
    最近更新 更多