asp.net - SignalR-ObjC 库的 SignalR 服务器错误 "The ConnectionId is in the incorrect format."

标签 asp.net objective-c xcode visual-studio-2012 signalr

在问一个单独的问题之前,我已经做了很多关于它的谷歌搜索,并在已经存在的 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();
            }
    }

如果我删除 Authorize 属性,问题仍然存在。

在我的 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)

我知道这是某种身份验证和用户身份不匹配,但到目前为止我还没有找到解决它的方法。所有其他问题都建议在用户身份更改时停止打开的连接,但正如我上面提到的,在用户成功登录之前我没有打开的连接。

任何帮助将不胜感激。 谢谢。

最佳答案

这是我发现的,我正在尝试为 signalR 创建一个 Flex/AS3 客户端。它只使用 websockets,但对于我的工作,我控制系统的两端,所以我知道我的后端会支持它。

无论如何,对我来说解决这个问题的技巧是对 connectionToken 进行编码。服务器端 signalR 代码试图从 token 中解析出连接 ID。当您从服务器获取 token 时,它作为协商握手的一部分出现,当您尝试将其发回时,您必须确保删除“/”和“+”符号并将它们分别编码为 %2F 和 %2B。在 AS3 中,转义或其他等效的 url 编码方法可能会留下斜杠,因为它是一个有效的 url 字符,但由于该值是在查询字符串中传递的,因此需要对其进行编码。

执行此操作后,我不再收到服务器 500 错误(ConnectionId 的格式不正确)并且套接字打开并且我收到了消息。

希望这对您有所帮助。

杰森

关于asp.net - SignalR-ObjC 库的 SignalR 服务器错误 "The ConnectionId is in the incorrect format.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18978904/

相关文章:

iphone - 我想以编程方式从照片库中删除图像?

iphone - 呈现一个没有 nib 文件的 View Controller

xcode - 如何将现有的 Xcode 目标从动态更改为静态?

c++ - "non-virtual thunk to <method name>", 引用自 : Vtable for <classname>in <objectfile. o>

ios - Xcode 上的多个 UIwebView

c# - 制作一个 Buttonfield 执行一个 javascript

jquery - 如何为 ASP.NET 和 ASP.NET MVC 创建通用菜单控件?

asp.net - 如何 : Use AJAX in an ASP. NET 自定义服务器控件

swift - 无法在 Xcode Playgrounds 中初始化 UICollectionView

javascript - 使用 Chart.js 创建图表 使用 C# 字符串会导致问题