2013-09-24 8 views
6

別の質問をする前に、私はそれについて多くのグーグルで行い、既に存在するstackoverflow questionにコメントを追加しました。SignalR Serverエラー "ConnectionIdの形式が正しくありません。" SignalR-ObjCライブラリ

私は以下のコードで私のサーバーにSignalRハブ(両方Vを試してみました1.1.3と2.0.0-RCを。)持っている:私は承認属性を削除した場合、問題が解決しない

[HubName("TestHub")] 
    public class TestHub : Hub 
    { 
      [Authorize] 
      public void TestMethod(string test) 
      { 
       //some stuff here 
       Clients.Caller.NotifyOnTestCompleted(); 
      } 
    } 

そして、私のiOSクライアントに私は以下のコードでそれを呼び出すようにしてみてください:アプリはユーザーがログインしていない起動し、何もオープンSignalRの連絡がない場合

SRHubConnection *hubConnection = [SRHubConnection connectionWithURL:_baseURL]; 
    SRHubProxy *hubProxy = [hubConnection createHubProxy:@"TestHub"]; 
    [hubProxy on:@"NotifyOnTestCompleted" perform:self selector:@selector(stopConnection)]; 

    hubConnection.started = ^{ 
     [hubProxy invoke:@"TestMethod" withArgs:@[@"test"]]; 
    }; 

    //received, error handling 
    [hubConnection start]; 

。ユーザーは、WebSecurity.Loginメソッドを使用するサーバーでログインサービスを呼び出してログインします。ログインサービスが成功を返す場合、私は上記のSignalR Hubを呼び出し、「ConnectionIdが間違った形式です」という説明でサーバーエラー500を取得します。

完全なサーバースタックトレースは以下の通りです:

Exception information: 
     Exception type: InvalidOperationException 
     Exception message: The ConnectionId is in the incorrect format. 
     at Microsoft.AspNet.SignalR.PersistentConnection.GetConnectionId(HostContext context, String connectionToken) 
     at Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(HostContext context) 
     at Microsoft.AspNet.SignalR.Hubs.HubDispatcher.ProcessRequest(HostContext context) 
     at Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(IDictionary`2 environment) 
     at Microsoft.Owin.Mapping.MapMiddleware.<Invoke>d__0.MoveNext() 
    --- End of stack trace from previous location where exception was thrown --- 
     at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
     at   Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult ar) 
     at System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
     at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 



    Request information: 
     Request URL: http://myserverip/signalr/signalr/connect?transport=webSockets&connectionToken=axJs EQMZxpmUopL36owSUkdhNs85E0fyB2XvV5R5znZfXYI/CiPbTRQ3kASc3 mq60cLkZU7coYo1P fbC0U1LR2rI6WIvCNIMOmv/mHut/Unt9mX3XFkQb053DmWgCan5zHA==&connectionData=[{"Name":"testhub"}] 
     Request path: /signalr/signalr/connect 
     User host address: 
     User: 
     Is authenticated: False 
     Authentication Type: 
     Thread account name: IIS APPPOOL\DefaultAppPool 

    Thread information: 
     Thread ID: 14 
     Thread account name: IIS APPPOOL\DefaultAppPool 
     Is impersonating: True 
     Stack trace: at Microsoft.AspNet.SignalR.PersistentConnection.GetConnectionId(HostContext context, String connectionToken) 
     at Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(HostContext context) 
     at Microsoft.AspNet.SignalR.Hubs.HubDispatcher.ProcessRequest(HostContext context) 
     at Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(IDictionary`2 environment) 
     at Microsoft.Owin.Mapping.MapMiddleware.<Invoke>d__0.MoveNext() 
    --- End of stack trace from previous location where exception was thrown --- 
     at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
       at       Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult ar) 
       at System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
       at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

私は、これは、認証とユーザー識別情報不一致のいくつかの種類であることを理解が、今まで私はそれを解決する手立ては認められません。他のすべての質問は、ユーザーIDが変更されたときに開かれた接続を停止することを示唆していますが、上記のとおり、ユーザーが正常にログインする前に開いている接続はありません。

ご協力いただければ幸いです。 ありがとうございます。

+0

この問題に対する解決策をお探しですか?私は同じ問題を抱えています。 – tremolo

+0

このエラーは5回のうち4回発生しています。時には、接続がサーバー上でconnectionIdエラーを生成しない場合がありますが、ほとんどの場合、そうなります。私はその場で認証プロセスを持っていません。 – tremolo

+0

@tremolo:申し訳ありませんが、解決策はまだありません。 – ozzotto

答えて

1

私たちも同様の問題がありました。 接続トークンの暗号化機能をオフにして固定しました。

申し訳ありません。私はiOS端末ではなく、.net端末で作業しています。

+0

どのようにして接続トークンの暗号化を無効にしましたか? – nil

2

ここで私が見つけたのは、私はsignalRのFlex/AS3クライアントを作成しようとしています。 WebSocketだけを使用しますが、私の仕事ではシステムの両端を制御するので、バックエンドでサポートされることがわかります。

とにかく、これを回避する方法は、connectionTokenをエンコードすることでした。サーバー側のsignalRコードはトークンから接続IDを解析しようとしています。サーバーからトークンを受け取ると、それはネゴシエーションハンドシェイクの一部として提供されます。返信しようとすると、 "/"と "+"記号をそれぞれ削除して%2Fと%2Bとしてエンコードする必要があります。 AS3では、エスケープやその他の同等のURLエンコーディングメソッドは、おそらく有効なURL文字であるためスラッシュを残しましたが、値がクエリー文字列に渡されるため、エンコーディングする必要があります。

これをやり終えたら、サーバー500のエラー(ConnectionIdの形式が間違っています)が表示されなくなり、ソケットが開き、メッセージが届きました。

これが役に立ちます。

あなたはそれがマスターに引き込まれるまで機能-2.0.0.beta1ブランチを使用してくださいhttps://github.com/DyKnow/SignalR-ObjCを使用しているようジェイソン

2

が見えます。

+0

バージョンを更新することで問題を解決できました。注意:私はポッドを使い、 'pod 'SignalR-ObjC':git => 'https://github.com/DyKnow/SignalR-ObjC.git'、:branch => 'feature-2.0.0を追加しました。 beta1''をポッドファイルに追加しました。 hth – GraehamF

関連する問題