我有一个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代理文件。
答案 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应该可用!