【问题标题】:Signalr (Android) not working when web app is on Azure当 Web 应用程序在 Azure 上时 Signalr (Android) 不工作
【发布时间】:2015-12-29 20:28:45
【问题描述】:

我找到了 Signalr for Android 的 SDK:https://github.com/SignalR/java-client。当 Web 应用程序托管在 IIS 上时,我的代码运行良好,但是当我在 Azure 上部署时,它无法连接;它永远等待

虽然我的 javascript 客户端代码运行良好。我按照以下步骤部署我的网络应用程序:http://www.asp.net/signalr/overview/deployment/using-signalr-with-azure-web-sites

我收到的以下日志

AutomaticTransport - Response received<br/>
AutomaticTransport - Read response data to the end<br/>
AutomaticTransport - Trigger onSuccess with negotiation data: {"Url":"/signalr","ConnectionToken":"4GGnSKxMOsuP6jkG1det5Z3Ch073H6ixe3Ium6k69k/RAM/x2KJkHP03XkNnPx56EatX8qxDmSOASS7HGKm5UJtsTqCP71YVJ05vLYrAT4pLYzecAwxziEUotCyVUpOc","ConnectionId":"28e1bb42-f03d-42b9-a874-171be7531eef","KeepAliveTimeout":20.0,"DisconnectTimeout":30.0,"ConnectionTimeout":110.0,"TryWebSockets":true,"ProtocolVersion":"1.3","TransportConnectTimeout":5.0,"LongPollDelay":0.0}<br/>
HubConnection - Negotiation completed<br/>
HubConnection - ConnectionId: 28e1bb42-f03d-42b9-a874-171be7531eef<br/>
HubConnection - ConnectionToken: 4GGnSKxMOsuP6jkG1det5Z3Ch073H6ixe3Ium6k69k/RAM/x2KJkHP03XkNnPx56EatX8qxDmSOASS7HGKm5UJtsTqCP71YVJ05vLYrAT4pLYzecAwxziEUotCyVUpOc<br/>
HubConnection - Keep alive timeout: 20.0<br/>
HubConnection - Entered startLock in startTransport<br/>
HubConnection - Starting the transport<br/>
HubConnection - Starting transport for InitialConnection<br/>
HubConnection - Getting connection data: [{"name":"myhub"}]<br/>
HubConnection - Getting connection data: [{"name":"myhub"}]<br/>

【问题讨论】:

  • IMO,基本的源代码已经足够好了:),请看stackoverflow.com/questions/32573823/…
  • 我已经实现了相同的方法,并且能够从本地 IIS 使用它,但是当我在 Azure 上上传我的 Web 解决方案并尝试从 android 连接时,它没有响应,它总是等待
  • 你的问题是关于 Signalr for Android,但是你对 Asp.Net SignalR 的评论,我没有尝试过使用 Azure。
  • 我可以从 javascript 客户端使用它,当我从 andriod 连接它时出现问题.. 请查看我更新的问题,我提到了我的日志输出.. 在“获取”后它不会继续连接数据:[{"name":"myhub"}]'
  • 谢谢...它成功了 :) :)

标签: java android azure websocket signalr


【解决方案1】:

基于@BNK 的 cmets 和我的理解,我为有同样问题的人发布了答案。

我查看了代码Connection.java (https://github.com/SignalR/java-client/blob/master/signalr-client-sdk/src/main/java/microsoft/aspnet/signalr/client/Connection.java),它有两个称为start 的函数。下面不带参数的start函数代码使用AutomaticTransport作为默认ClientTransport

public SignalRFuture<Void> start() {
    return start(new AutomaticTransport(mLogger));
}

我继续查看代码AutomaticTransport.java (https://github.com/SignalR/java-client/blob/master/signalr-client-sdk/src/main/java/microsoft/aspnet/signalr/client/transport/AutomaticTransport.java)。它尝试在包含WebSocketTransportServerSentEventsTransportLongPollingTransport的函数initialize中选择三个ClientTransport之一,见下文。

private void initialize(Logger logger) {
    mTransports = new ArrayList<ClientTransport>();
    mTransports.add(new WebsocketTransport(logger));
    mTransports.add(new ServerSentEventsTransport(logger));
    mTransports.add(new LongPollingTransport(logger));
}

问题的原因可能是在 Azure 上使用 SignalR 的服务器未实现支持 AutomaticaTransport 的三种传输。

所以使用Connection类的public SignalRFuture&lt;Void&gt; start(final ClientTransport transport)函数手动选择服务端支持的传输来解决问题。

【讨论】:

    【解决方案2】:

    SignalR 依赖于 WebSockets。要在 Azure Web 应用程序上使用 SignalR,您必须为您的站点启用 WebSockets。

    要启用 WebSockets,请转到您的站点https://manage.windowsazure.com->配置->WebSockets->设置为“开启”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 2014-07-17
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      相关资源
      最近更新 更多