繁体   English   中英

SignalR客户端将无法使用Azure Worker Role中的OWIN Self Host连接

[英]SignalR client won't connect using OWIN Self Host in Azure Worker Role

我有一个具有辅助角色的Azure云服务,该服务在启动时启动使用SignalR的OWIN Web应用程序。

另外,我有一个控制台项目,该项目使用SignalR客户端库连接到此辅助角色并侦听事件。

当我使用Azure模拟器在本地运行客户端和服务时,一切正常。

当我发布云服务并将控制台应用程序指向它并尝试连接时,在SignalR跟踪日志中得到以下信息:

WS Connecting to: ws://myapp.cloudapp.net/signalr/connect?clientProtocol=1.4&transport=webSockets&connectionData=[{"Name":"MessageBusHub"}]&connectionToken=...

OnError(System.Net.WebSockets.WebSocketException (0x80004005): An internal WebSocket error occurred. Please see the innerException, if present, for more details. ---> System.Net.Sockets.SocketException (0x80004005): An existing connection was forcibly closed by the remote host

然后,它将继续尝试使用服务器发送的事件再次进行尝试,并且每次都使用相同的错误进行长时间轮询。

我在云服务配置中使用以下端点:

<Endpoints>
  <InputEndpoint name="SignalREndpoint" protocol="http" port="80" localPort="80" />
</Endpoints>

这是我创建OWIN Web应用程序的方式:

var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["SignalREndpoint"];
string webAppUrl = $"{endpoint.Protocol}://{endpoint.IPEndpoint}";
_webApp = WebApp.Start<Startup>(webAppUrl);

最后,这是我配置SignalR的方法:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseCors(CorsOptions.AllowAll);
        app.UseServerAuthentication();
        GlobalHost.DependencyResolver.UseServiceBus(CloudConfigurationManager.GetSetting("ServiceBusConnectionString"), "SignalRMessageBus");
        app.MapSignalR(new HubConfiguration()
        {
            EnableDetailedErrors = true,
        });
    }
}

在客户端项目中,我简单地使用HubConnection使用本地测试以下URL连接, http://localhost:80 ,以及用于连接到云实例下面的网址, http://myapp.cloudapp.net

我不确定实际的Azure实例与本地模拟器之间的区别是什么导致它在云中无法正常工作。

有趣的是,如果我使用浏览器连接到URL http://myapp.cloudapp.net/signalr/hubs ,它将起作用并返回JS代理文件。

您是否尝试过使用TCP代替HTTP作为协议?

我无论如何都不是SignalR专家,但是我知道这一点。 当我们将服务器(XSockets.NET)托管在Azure辅助角色上时,我们会将协议配置为TCP(而非HTTP)。 不知道为什么它可以在本地主机上工作。

要考虑的另一件事是工作角色是否支持websocket? SignalR需要IIS8 +来支持websocket,我不知道您是否可以通过辅助角色访问它。 Azure中没有选项可以打开/关闭辅助角色的Websocket(据我所见)。 因此,我的猜测是辅助角色中没有Microsoft WebSockets。 我可能在这里错了!

编辑:查看了我的一个实例,发现我可以更改操作系统,默认实例是2012 Server。 因此,Microsoft websockets应该可用!

暂无
暂无

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

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