SignalR HTTP状态400多个客户端

时间:2016-01-04 08:32:06

标签: android signalr owin signalr-hub

我在服务器端运行SignalR 2.2.0的应用程序,在Android上运行signalr-java-client(自编译,最后一个GitHub版本)作为客户端。

目前,我的集线器连接了4个客户端。有时会发生这样的情况:所有4个客户端同时收到HTTP状态400,并显示消息“连接ID格式不正确”(客户端之前已连接)。我对此进行了多次分析,并且无法找到任何信息/模式何时或为何发生这种情况。

连接通过JWT保护,令牌绝对有效。检索新令牌时,将停止连接并再次启动。除此之外,错误不太可能与设备相关,因为同时在所有4个客户端抛出错误。

我知道,当客户端的身份发生变化时可能会发生此错误,但同时对4个客户端的身份更改似乎不太可能。

这是用于身份验证的服务器代码( Deepak 询问)。

在我的Startup.cs中调用以下方法:

public static void ConfigureOAuth(IAppBuilder app, string audienceID, string sharedSecret)
{
    byte[] secret = TextEncodings.Base64Url.Decode(sharedSecret);

    app.UseJwtBearerAuthentication(
       new JwtBearerAuthenticationOptions
       {
           Provider = new MyOAuthBearerAuthenticationProvider(),
           AuthenticationMode = AuthenticationMode.Active,
           AllowedAudiences = new[] { audienceID },
           IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
            {
                new SymmetricKeyIssuerSecurityTokenProvider(Issuer, secret)
            }
       });
}

以下是MyOAuthBearerAuthenticationProvider类的代码:

class MyOAuthBearerAuthenticationProvider : OAuthBearerAuthenticationProvider
{
    /// <summary>
    /// Get's a JWT from querysting and puts it to context
    /// </summary>
    public override Task RequestToken(OAuthRequestTokenContext context)
    {
        if (context.Token == null)
        {
            string value = context.Request.Query.Get("auth_token");
            if (!string.IsNullOrEmpty(value))   //token from queryString
            {
                context.Token = value;
            }
        }

        return Task.FromResult<object>(null);
    }
}

我必须从查询字符串中检索令牌,因为除了java-client之外,还使用了一个javascript客户端,它无法设置头文件。

最后,我使用Authorization属性保护我的集线器及其中的一些方法:

[Authorize(Roles = "MyExampleRole")]

这是连接的客户端代码:

public boolean connect(String url, String token) {

    if (connected) {
        return true;
    }

    try {

        this.hubConnection = new HubConnection(url, "auth_token=" + token, true, logger);

        this.hubProxy = hubConnection.createHubProxy("MyHub");
        this.hubProxy.subscribe(this.signalRMethodProvider);

        this.hubConnection.stateChanged(stateChangedCallback);

        SignalRFuture<Void> awaitConnection = this.hubConnection.start();
        awaitConnection.get(10000, TimeUnit.MILLISECONDS);
        return true;
    }
    catch (InterruptedException | TimeoutException | ExecutionException e) {

        log.error("connect", e);
        return false;
    }
}

是否有人有想法,如何解决此问题或我可能会收到更多信息?

非常感谢你 -Lukas

1 个答案:

答案 0 :(得分:0)

看起来很好...... 你可以做的改变是改变

2^>^&1

awaitConnection.get(10000, TimeUnit.MILLISECONDS);