我正在尝试从Android客户端连接signalR。我已经安装了signalR集线器,并且它可以与浏览器上的javascript客户端一起正常使用。 javascript客户端能够发送承载令牌,并且在服务器端,我能够获取用户身份。 但是android java客户端无法发送承载令牌。我正在使用https://github.com/SignalR/java-client库(因为我没有使用SIgnalR-core,所以没有使用最新的SIgnalR核心库)
connection = new HubConnection(serverUrl);
connection.getHeaders().put("Authorization","Bearer XYZ");
proxy = connection.createHubProxy(hubName);
运行此代码时,出现错误
java.lang.InterruptedException: Operation was canceled
但是当我不随请求发送AUthorization标头时,则在服务器端SIgnalR OnConnected()方法上成功调用。
问题似乎与请求一起发送Authorization标头。
作为参考,下面的代码显示了如何在服务器端实现令牌认证
app.Map("/signalr", map =>
{
map.UseCors(CorsOptions.AllowAll);
map.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
{
Provider = new QueryStringOAuthBearerProvider()
});
var hubConfiguration = new HubConfiguration
{
Resolver = GlobalHost.DependencyResolver,
};
map.RunSignalR(hubConfiguration);
});
ConfigureAuth(app);
我尝试通过从服务器删除授权来调用它。然后成功调用。但是使用Authorization标头调用时不起作用。
当我尝试在没有授权的情况下进行连接时,则在服务器端OnConnected方法上调用了Context。身份为空。
用于连接到SignalR客户端的android Java代码
Platform.loadPlatformComponent(new AndroidPlatformComponent());
// Create Connection
connection = new HubConnection(serverUrl);
connection.getHeaders().put("Authorization","Bearer XYZ");
// Create Proxy
proxy = connection.createHubProxy(hubName);
// Establish Connection
ClientTransport clientTransport = new
ServerSentEventsTransport(connection.getLogger());
SignalRFuture<Void> signalRFuture = connection.start(clientTransport);
try {
signalRFuture.get();
} catch (InterruptedException e) {
return false;
} catch (ExecutionException e) {
return false;
}
return true;
答案 0 :(得分:0)
如果您使用的是Websocket,请尝试此操作
https://github.com/doctorcareanywhere/java-client
构建signalr-client-sdk并将jar导入您的项目
例如
实施文件('libs / signalr-client-sdk.jar')