SignalR客户端赢得';无法在Azure Worker角色中使用OWIN自主机进行连接

本文关键字:角色 OWIN 连接 主机 Worker Azure 客户端 SignalR | 更新日期: 2023-09-27 18:20:21

我有一个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网络应用程序的方法:

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和以下URL连接到云实例http://myapp.cloudapp.net

我不确定实际的Azure实例和我的本地模拟器之间有什么不同,这导致它无法在云中工作。

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

SignalR客户端赢得';无法在Azure Worker角色中使用OWIN自主机进行连接

您是否尝试过使用TCP而不是HTTP作为协议?

我不是SignalR专家,但我知道这一点。当我们在Azure工作人员角色上托管服务器(XSockets.NET)时,我们将协议配置为TCP(而不是HTTP)。但不知道为什么它能在本地主机上工作。

另一个需要考虑的问题是worker角色是否支持websocket?SignalR需要IIS8+来支持websocket,我不知道你是否可以以工作者的身份访问它。Azure中没有打开/关闭工作角色的websocket的选项(据我所见)。所以我的猜测是,在工作者角色中没有Microsoft WebSockets。我可能错了!

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