我有一个使用 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 上设置的传输似乎没有任何区别:我仍然得到同样的错误。