2013-09-24 42 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客戶端我嘗試用下面的代碼來調用它:

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]; 

當應用程序啓動用戶沒有登錄且沒有開放SignalR連接。用戶通過在使用WebSecurity.Login方法的服務器中調用登錄服務來登錄。如果登錄服務返回成功,我將上面的呼叫轉到SignalR Hub,然後我得到服務器錯誤500,描述爲「ConnectionId的格式不正確」。

完整的服務器堆棧跟蹤如下:

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) 

我明白這是某種形式的身份驗證和用戶身份不匹配的,但到現在爲止我還沒有發現任何解決它的辦法。所有其他問題都建議在用戶身份更改時停止打開的連接,但正如我上面提到的,在用戶成功登錄之前,我沒有打開連接。

任何幫助將不勝感激。 謝謝。

+0

您是否找到了解決方案?我有同樣的問題。 – tremolo

+0

我得到這個錯誤約5次5。所以有時候,連接不會在服務器上產生connectionId錯誤,但大多數情況下它都會產生連接錯誤。雖然我沒有任何身份驗證過程。 – tremolo

+0

@tremolo:對不起,尚未解決。 – ozzotto

回答

1

我們有類似的問題。 關閉連接令牌的加密函數修復它。

對不起,我不能進一步,因爲我正在iOS端而不是.net端。

+0

你是如何禁用連接令牌加密的? – nil

2

這是我發現的,我試圖爲signalR創建一個Flex/AS3客戶端。它只使用websockets,但對於我的工作我控制系統的兩端,所以我知道我的後端將支持它。

無論如何,解決這個問題的技巧是編碼connectionToken。服務器端的signalR代碼試圖從令牌中解析出連接ID。當您從服務器獲取令牌時,它將作爲協商握手的一部分,當您嘗試將其發回時,必須確保刪除「/」和「+」符號並分別將其編碼爲%2F和%2B。在AS3中,轉義或其他等價的url編碼方法會留下斜線,這大概是因爲它是一個有效的url字符,但由於該值是在查詢字符串中傳遞的,因此需要對其進行編碼。

一旦我這樣做,我停止得到一個服務器500錯誤(ConnectionId格式不正確)和套接字打開,我收到消息。

希望這會有所幫助。

傑森

2

看起來你正在使用https://github.com/DyKnow/SignalR-ObjC一定要使用該功能,2.0.0.beta1分支,直到它拉成高手。

+0

更新版本幫助我解決了這個問題。注意:我使用pod並添加了'pod'SignalR-ObjC',::git =>'https://github.com/DyKnow/SignalR-ObjC.git',:branch =>'feature-2.0.0。 beta1'在podfile中。心連心 – GraehamF