Azure网站上“ping”期间SignalR 500错误

时间:2012-12-28 05:43:00

标签: azure signalr azure-web-sites

我有一个使用SignalR 1.0.0-rc1的ASP.NET 4.5网络应用程序,我已经推送到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错误,并显示消息“Protocol error:Unknown transport”。错误页面中返回的堆栈跟踪如下所示:

[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上设置传输的方式似乎没有任何区别:我仍然得到相同的错误。

1 个答案:

答案 0 :(得分:0)

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