SignalR客户端无法使用Azure辅助角色中的OWIN自身主机进行连接

时间:2015-11-02 22:30:22

标签: c# azure signalr owin azure-worker-roles

我有一个Azure云服务,其工作角色在启动时启动OWIN Web应用程序,使用SignalR。

另外,我有一个控制台项目,它使用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代理文件。

1 个答案:

答案 0 :(得分:0)

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

我不是任何方式的SignalR专家,但我知道。当我们在Azure辅助角色上托管我们的服务器(XSockets.NET)时,我们将协议配置为TCP(而不是HTTP)。 不知道为什么它可以在localhost上工作。

另一件需要考虑的事情是worker角色是否支持websockets? SignalR需要IIS8 +才能支持websocket,我不知道你是否可以在worker角色中访问它。 Azure中没有选项可以在工作者角色上打开/关闭websockets(从我可以看到)。所以我的猜测是工作者角色中没有Microsoft WebSockets。我可能在这里错了!

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