在提出单独的问题之前,我已经完成了很多关于它的谷歌搜索,并在现有的stackoverflow question中添加了评论。
我的服务器中有一个SignalR Hub(试过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 :(得分:2)
这是我发现的,我正在尝试为signalR创建一个Flex / AS3客户端。它只使用websockets,但对于我的工作,我控制系统的两端,所以我知道我的后端会支持它。
无论如何,为我解决这个问题的诀窍是编码connectionToken。服务器端signalR代码试图从令牌中解析出连接ID。当您从服务器获取令牌时,它作为协商握手的一部分,当您尝试将其发回时,您必须确保删除“/”和“+”符号并将它们分别编码为%2F和%2B。在AS3中,转义或其他等效的url编码方法可能因为它是一个有效的url字符而留下斜杠,但由于该值是在查询字符串中传递的,因此需要对其进行编码。
一旦我这样做,我就停止了服务器500错误(ConnectionId的格式不正确),套接字打开,我收到了消息。
希望这有帮助。
杰森
答案 1 :(得分:2)
看起来你正在使用https://github.com/DyKnow/SignalR-ObjC一定要使用feature-2.0.0.beta1分支,直到它被拉入主分区。
答案 2 :(得分:1)
我们遇到了类似的问题。 关闭连接令牌的加密功能可以修复它。
抱歉,我无法继续,因为我在iOS端工作而不是.net端。