0

Sencha Touch 2.1 と PhoneGap 2.5.0 を使用して、ネイティブの Android アプリ内から SignalR に接続しようとしています。

これが私がこれまでに持っているものです:

私の SignalR サーバーは、Windows Server 2012 で実行されている ASP.NET MVC3 アプリケーションです。global.asax.vb でクロス ドメイン アクセスが有効になっています。

グローバル.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

SignalR サーバーに接続して「認証」機能を呼び出す Sencha Touch 2.1 アプリケーションを開発しました。これは、Chrome Web ブラウザーでうまく機能します。次のように、index.html ファイルに SignalR への参照を追加しました。

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 アプリケーション内から「authenticate」メソッドを呼び出すために使用されるコードです。

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);
        });
}
}

私は現在、Sencha Touch 2.1 アプリケーションをラップするために PhoneGap 2.5.0 を使用しており、それを Android 4.2.2 シミュレーターにデプロイしています。アプリケーションは、接続を開始するときに、done コールバック関数で見つかった「Connected to Server」ログを表示します。しかし、「認証」機能を呼び出そうとしても何も起こりません。ログは次のとおりです。

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で動作させるのを手伝ってもらえますか?

4

2 に答える 2

0

トラブルシューティングのためにいくつかのことを試してください: 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>

Hub でトレースを行うサンプル クラス

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);
    }
}
于 2013-03-27T18:26:22.603 に答える
0

アドバイスありがとう、グスタボ。あなたが提案したように、追加のトレースを実装しました。これは非常に役立つと確信しています。しかし、追加のトレースを実装していたときに、signalr dll がリリース バージョン 1.0.1 から signalr の開発ブランチからビルドされた dll に変更されていることに気付きました。これは、シグナルで遭遇した他の問題を調査するために行われました。残念ながら、新しい dll はシグナル サーバーのクロス ドメインにアクセスする機能を壊していたため、ネイティブの Android アプリをシグナルで動作させることができませんでした。何が起こったのかを理解した後、dll を元に戻し、シミュレーターとデバイスの両方で phonegap アプリケーションが期待どおりに signalr と通信できるようになりました。

于 2013-04-10T00:20:28.300 に答える