Я пытаюсь подключиться к 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?