Подключение к SignalR в приложении Android с помощью Sencha Touch 2.1 и PhoneGap

Я пытаюсь подключиться к SignalR из собственного приложения для Android, используя Sencha Touch 2.1 и PhoneGap 2.5.0.

Вот что у меня есть до сих пор:

Мой сервер SignalR — это приложение ASP.NET MVC3, работающее на Windows Server 2012. Междоменный доступ включен в global.asax.vb.

Global.asax.vb

Sub Application_Start()
    Dim config As New HubConfiguration
    config.EnableCrossDomain = True     'Allow cross domain (for native apps)
    RouteTable.Routes.MapHubs(config)

    AreaRegistration.RegisterAllAreas()

    RegisterGlobalFilters(GlobalFilters.Filters)
    RegisterRoutes(RouteTable.Routes)
End Sub

Я использую концентраторы SignalR 1.0.1. Я реализовал метод аутентификации, который вызывает мое приложение Sencha Touch:

Передатчик.vb

Public Class Transmitter
    Inherits Hub

    Public Sub authenticate(ByVal sClientId As String, _
                            ByVal sPassword As String)
        Try
            Dim bRegistered As Boolean = ValidateUser(sClientId, sPassword)

            If bRegistered Then
                Clients.Caller.isAuthenticated(True)
            Else
                Clients.Caller.isAuthenticated(False)
            End If
        Catch ex As Exception
            LogEvent("Authenticate: " & ex.Message)
        End Try
    End Sub
End Class

Я разработал приложение Sencha Touch 2.1, которое подключается к моему серверу SignalR и вызывает функцию аутентификации. Это хорошо работает в веб-браузере Chrome. Я добавил ссылки на SignalR в файл index.html, например:

index.html

<script src="https://www.mySite.com/SignalRServer/Scripts/jquery-1.6.4.min.js" type="text/javascript"></script>
<script src="https://www.mySite.com/SignalRServer/Scripts/jquery.signalR-1.0.1.js" type="text/javascript"></script>
<script src="https://www.mySite.com/SignalRServer/signalr/hubs"></script>

Вот код, используемый для подключения к SignalR и вызова метода аутентификации из моего приложения Sencha Touch:

MySenchaTabPanel.js

listeners: {

activate: function () {
    $.connection.hub.logging = true;
    $.connection.hub.url = 'https://www.mySite.com/SignalRServer/signalr';

    var transmitterProxy = $.connection.transmitter;

    transmitterProxy.client.isAuthenticated = function (bAuthenticated) {
        console.log('isAuthenticated: ' + bAuthenticated);
    };

    console.log('Connecting to server...');

    $.connection.hub.start()
        .done(function () {
            console.log('Connected to Server: Transport: ' + $.connection.hub.transport.name);
            transmitterProxy.server.authenticate(sClientId, sPassword);
        })
        .fail(function (error) {
            console.log('Could not connect to server:' + error);
        });
}
}

Сейчас я использую PhoneGap 2.5.0 для создания оболочки приложения Sencha Touch 2.1 и развертываю его на симуляторе Android 4.2.2. Приложение отображает журнал «Подключено к серверу», найденный в функции обратного вызова done при запуске соединения. Но ничего не происходит, когда он пытается вызвать функцию аутентификации. Вот журнал:

03-26 05:29:38.631: D/CordovaLog(1758): exception firing pause event from native
03-26 05:29:49.978: D/CordovaLog(1758): Connecting to server...
03-26 05:29:51.330: D/CordovaLog(1758): exception firing destroy event from native
03-26 05:29:51.688: D/CordovaLog(1758): [05:29:51 GMT+0000 (GMT)] SignalR: Auto detected cross domain url.
03-26 05:29:51.688: D/CordovaLog(1758): [05:29:51 GMT+0000 (GMT)] SignalR: Negotiating    with 'https://www.mySite.com/SignalRServer/signalr/negotiate'.
03-26 05:29:52.840: D/CordovaLog(1758): [05:29:52 GMT+0000 (GMT)] SignalR: SignalR: Initializing long polling connection with server.
03-26 05:29:53.988: D/CordovaLog(1758): [05:29:53 GMT+0000 (GMT)] SignalR: Attempting to connect to 'https://www.mySite.com/SignalRServer/signalr/connect?transport=longPolling&connectionToken=fW1SyP5V9Qwq7d0WF3FBn8Fr9rXvNJZ-VryuonW7LlsUyIbUlQ5LlW9gTRJNGch9t8yO4te8fbyZW2ZPKY_eAdnvIz6tHKxX0rmq8qNa8tv0budwIBjwD6YM1j4pSDTs0&connectionData=%5B%7B%22name%22%3A%22transmitter%22%7D%5D&tid=2' using longPolling.
03-26 05:29:54.258: D/CordovaLog(1758): Connected to Server: Transport: longPolling
03-26 05:29:54.358: D/CordovaLog(1758): [05:29:54 GMT+0000 (GMT)] SignalR: Longpolling connected
03-26 05:29:54.799: D/CordovaLog(1758): [05:29:54 GMT+0000 (GMT)] SignalR: Triggering client hub event 'joined' on hub 'Transmitter'.
03-26 05:29:54.808: D/CordovaLog(1758): [05:29:54 GMT+0000 (GMT)] SignalR: Attempting to connect to 'https://www.mySite.com/SignalRServer/signalr?transport=longPolling&connectionToken=fW1SyP5V9Qwq7d0WF3FBn8Fr9rXvNJZ-VryuonW7LlsUyIbUlQ5LlW9gTRJNGch9t8yO4te8fbyZW2ZPKY_eAdnvIz6tHKxX0rmq8qNa8tv0budwIBjwD6YM1j4pSDTs0&connectionData=%5B%7B%22name%22%3A%22transmitter%22%7D%5D&messageId=B%2C45%7CBo%2C0%7CBp%2C0%7CBq%2C0&tid=10' using longPolling.

Те же результаты видны, когда я развертываю приложение на устройстве Samsung Galaxy Android 4.1.2 (после того, как я укажу транспортный протокол, чтобы обойти известную проблему с Android и SignalR). Может ли кто-нибудь помочь мне заставить SignalR работать на Android?


person LJS_27    schedule 26.03.2013    source источник


Ответы (2)


Попробуйте выполнить следующие действия для устранения неполадок: 1. Добавьте простой метод Hub.Echo() и зарегистрируйте его с помощью System.Diagnostics.Debug.WriteLine при вызове. 2. Включите трассировку сервера в файле web.config, чтобы убедиться, что клиент действительно отправляет сообщение. на сервер 3. Сравните трассировки, созданные вашим работающим устройством и вашим неисправным устройством.

Если возможно, попробуйте включить Fiddler на стороне клиента (http://www.fiddler2.com/fiddler2/version.asp) https://github.com/SignalR/SignalR/wiki/Using-fiddler-with-signalr

Изменения в web.config

  <system.diagnostics>
    <trace autoflush="true" indentsize="4">
      <listeners>
        <add name="default_traces" type="System.Diagnostics.TextWriterTraceListener" initializeData="default_traces.txt" />
      </listeners>
    </trace>
    <switches>
      <add name="SignalRSwitch" value="All" />
    </switches>
    <sources>

      <source name="Application" switchValue="All">
        <listeners>
          <add name="traces" />
        </listeners>
      </source>

      <source name="Microsoft.Owin.Host.SystemWeb" switchValue="All">
        <listeners>
          <add name="traces" />
        </listeners>
      </source>

      <source name="SignalR.Connection">
        <listeners>
          <add name="traces" />
        </listeners>        
      </source>
      <source name="SignalR.PersistentConnection">
        <listeners>
          <add name="traces" />
        </listeners>
      </source>
      <source name="SignalR.HubDispatcher">
        <listeners>
          <add name="traces" />
        </listeners>
      </source>
      <source name="SignalR.Transports.WebSocketTransport">
        <listeners>
          <add name="traces" />
        </listeners>
      </source>
      <source name="SignalR.Transports.ServerSentEventsTransport">
        <listeners>
          <add name="traces" />
        </listeners>
      </source>
      <source name="SignalR.Transports.ForeverFrameTransport">
        <listeners>
          <add name="traces" />
        </listeners>
      </source>
      <source name="SignalR.Transports.LongPollingTransport">
        <listeners>
          <add name="traces" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add name="traces" type="System.Diagnostics.TextWriterTraceListener" initializeData="server_traces.txt" />
    </sharedListeners>
  </system.diagnostics>

Пример класса для трассировки в вашем концентраторе

public class AppLogging
{
    static TraceSource traceSource = new TraceSource("Application");

    internal static void WriteVerbose(string format, params object[] args)
    {
        traceSource.TraceEvent(TraceEventType.Verbose, 0, format, args);
    }

    internal static void WriteInformation(string format, params object[] args)
    {
        traceSource.TraceEvent(TraceEventType.Information, 0, format, args);
    }
}
person Gustavo Armenta    schedule 27.03.2013

Спасибо за совет, Густаво. Я реализовал дополнительную трассировку, как вы предложили, и я уверен, что она будет очень полезна. Однако, когда я реализовывал дополнительную трассировку, я обратил внимание на то, что библиотеки DLL signalr были изменены с выпуска версии 1.0.1 на библиотеки DLL, которые были созданы из ветки разработки signalr. Это было сделано для изучения других проблем, с которыми мы столкнулись в signalr. К сожалению, новые dll нарушили возможность доступа к междоменным серверам signalr, и, следовательно, это было причиной, по которой я не мог заставить свое родное приложение для Android работать с signalr. Как только мы поняли, что произошло, мы заменили dll обратно, и теперь у меня есть приложение phonegap, которое, как и ожидалось, взаимодействует с signalr, как в симуляторе, так и на устройстве.

person LJS_27    schedule 10.04.2013