2013-09-24 41 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