【问题标题】:SignalR HTTP status 400 multiple clientsSignalR HTTP 状态 400 多个客户端
【发布时间】:2016-01-04 19:17:53
【问题描述】:

我在服务器端运行 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;
    }
}

有没有人有想法,如何解决这个问题或者我可以在哪里收到更多信息?

非常感谢 -卢卡斯

【问题讨论】:

  • 请分享您的代码,我可能会有所帮助
  • 我应该分享哪个代码?项目本身很大。
  • signalr 授权类
  • 查看我上次的编辑,它包含用于授权的代码。
  • 对我来说似乎很好...请分享 android 连接启动代码...您在哪里启动集线器..

标签: android signalr owin signalr-hub


【解决方案1】:

看起来不错... 你可以做的可能的改变是改变

awaitConnection.get(10000, TimeUnit.MILLISECONDS);

awaitConnection.done(new Action<Void>() {
            @Override
            public void run(Void obj) throws Exception {

                Log.d(TAG, "Hub Connected");
            }
        }).onError(new ErrorCallback() {
            @Override
            public void onError(Throwable error) {
                error.printStackTrace();
                Log.d(TAG, "SignalRServiceHub Cancelled");

            }
        }).onCancelled(new Runnable() {
            @Override
            public void run() {
                Log.d(TAG, "SignalRServiceHub Cancelled");

            }
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 2013-01-13
    • 2015-12-22
    • 2012-03-09
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多