SignalR IOS 客户端,Web 套接字传输无法从服务器调用方法

Posted

技术标签:

【中文标题】SignalR IOS 客户端,Web 套接字传输无法从服务器调用方法【英文标题】:SignalR IOS Client, Web Socket transport cannot invoke the method from server 【发布时间】:2014-06-02 09:12:57 【问题描述】:

我正在使用 SignalR-ObjC 客户端在我的 ios 应用程序和 .Net 服务器之间提供通信。

我可以从自托管跨域服务器连接长拉并调用方法而不会出现任何错误。但由于我的应用程序需要,我必须使用 WebSocket。我有一个像这样的单身经理:

@implementation SignalRManager
static int reconnectingTry;
+ (id)sharedManager 
    static SignalRManager *sharedHttpManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^
        sharedHttpManager = [[self alloc] init];
        sharedHttpManager.hubConnection = [SRHubConnection connectionWithURL:@"http://xxx:8080/signalr"];
        sharedHttpManager.proxy = [sharedHttpManager.hubConnection createHubProxy:@"myhub"];
    );

    return sharedHttpManager;

+(SRHubProxy *)proxy

    return [[SignalRManager sharedManager] proxy];


+(SRHubConnection *)connection

    return [[SignalRManager sharedManager] hubConnection];


+(void)start

    SRWebSocketTransport *transport = [[SRWebSocketTransport alloc] init];

    [[SignalRManager connection] start:transport];


+(void)stop

    [[SignalRManager connection] stop];

我正在调用:

 [[SignalRManager proxy] invoke:@"Hello" withArgs:[NSArray array]];

我建立连接,服务器可以调用客户端方法,但是当我尝试从客户端调用方法到服务器时,出现“请求失败:错误请求(400)”错误。

【问题讨论】:

【参考方案1】:

似乎是SRWebSocketTransport中的协议(SRClientTransportInterface)实现有问题。

其实是:

- (void)send:(id <SRConnectionInterface>)connection data:(NSString *)data completionHandler:(void (^)(id response, NSError *error))block;

而且必须是

- (void)send:(id <SRConnectionInterface>)connection data:(NSString *)data connectionData:(NSString *)connectionData completionHandler:(void (^)(id response, NSError *error))block; 

像子类没有那个实现正在调用超类 (SRHttpBasedTransport) 方法,因此您得到“请求失败:错误请求 (400)”(是另一个 http 请求而不是 websocket)。

要修复,只需在 Pods 项目中打开文件 SRWebSocketTransport.m 并更改实现,如下所示:

- (void)send:(id<SRConnectionInterface>)connection data:(NSString *)data connectionData:(NSString *)connectionData completionHandler:(void (^)(id response, NSError *error))block 
    [_webSocket send:data];

    if(block) 
        block(nil,nil);
    

希望对您有所帮助。

pd:只检查 github 似乎已在 feature-2.0.0.beta1 分支中修复

【讨论】:

太棒了!那就是解决我的问题。非常感谢! @dolcalmi 太棒了!我浪费了几个小时,谢谢!顺便说一句,我们为什么不将它添加到 SignalR-ObjC 基础代码中? 如何使用 pod 导入 feature-2.0.0.beta1 ? 在某些带有 8.x 客户端的 wifi 网络上,传输似乎比长轮询要脆弱得多 :-( 我不得不恢复为长轮询 :-[ @dolcalmi 我无法从 SignalR 服务器获取数据,请查看此链接:***.com/questions/32477837/…

以上是关于SignalR IOS 客户端,Web 套接字传输无法从服务器调用方法的主要内容,如果未能解决你的问题,请参考以下文章

SignalR学习

使用 .NET 客户端时的 SignalR 传输

Signalr 实现心跳包

SignalR:服务器如何建立与客户端的连接?

Signalr指定传输协议

.NETCOREASP.NET Core SignalR