我正在使用 SignalR-ObjC Client 在我的 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)”错误。
最佳答案
似乎是 SRWebSocketTransport 中的协议(protocol) (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;
就像子类没有调用父类(super class) (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 分支中修复
关于c# - SignalR IOS 客户端,Web 套接字传输无法从服务器调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23990998/