使用 Ably.io 创建连接时出现未知错误

Posted

技术标签:

【中文标题】使用 Ably.io 创建连接时出现未知错误【英文标题】:Get Unknown error when connecting creating a connection using Ably.io 【发布时间】:2019-02-14 23:39:02 【问题描述】:

我们有一个用例,用户尚未登录应用程序,也没有创建身份验证令牌。应用程序需要连接到公共通道上的 Web 服务器以检查应用程序更新。连接失败。错误原因如下:“未知错误;代码:500;HttpStatus 代码:(404)NotFound。

来自 Nuget 0.8.11 的 Ably 库和 SDK。

以下代码没有连接到网络服务器。

    public ExtendedAblyIoClient(string name, string ClientId, string ChannelId, string AuthUrl, string ablyKey)
    
        _name = name;
        _authUrl = AuthUrl;
        _clientId = ClientId;
        _channelId = ChannelId;
        _ablyAppKey = ablyKey;
        _authUri = new Uri(_authUrl);  // local host for testing and development.
        _httpRequestTime = TimeSpan.FromHours(2.0);

        ClientOptions clientOptions = new ClientOptions
        
            Key = _ablyAppKey,
            ClientId = _clientId,
            AuthUrl = _authUri,
            Tls = false,
            HttpRequestTimeout = _httpRequestTime,
            HttpOpenTimeout = _httpRequestTime
        ;

        commonInitialization(clientOptions);
        _channel = _ablyClient.Channels.Get(_channelId);
        _channel.Subscribe(message =>
        
            OnMessageCallback(_sender, _channelId, message.Data.ToString());
        );

    

    private void commonInitialization(ClientOptions clientOptions)
    
        _ablyClient = new AblyRealtime(clientOptions);

        _ablyClient.Connection.On(ConnectionState.Connected, args =>
        
            realTimeClientOnConnected(_sender);
        );

        _ablyClient.Connection.On(ConnectionState.Disconnected, args =>
        
            realTimeClientOnDisconnected(_sender);
        );
        _ablyClient.Connection.On(ConnectionState.Failed, args =>
        
            string WhyError = _name + " Failed: " + _ablyClient.ToString();
            realTimeClientOnDisconnected(WhyError);
        );
    

【问题讨论】:

【参考方案1】:

404 将来自客户端库,尝试联系您指定的 AuthUrl,并获得 404。

从您的问题来看,您似乎希望在连接到“公共频道”时不必进行身份验证。这不是 Ably auth 的工作方式。任何连接到您的应用程序的用户都需要经过身份验证,才能使用令牌或 api 密钥进行连接,这就是身份验证的含义。

如果您不希望他们连接到不在public: 命名空间中的任何频道,并且只有这些频道的订阅功能,您可以提供功能设置为"public:*":["subscribe"] 的令牌。但是你仍然需要给他们一个令牌。

阅读 https://www.ably.io/documentation/general/authentication 以获取有关 Ably 身份验证模型的文档,并阅读 https://www.ably.io/documentation/realtime/authentication 以了解具体的实时连接身份验证。

编辑:您指出您也在传递一个密钥。客户端不能同时使用两者——它要么与密钥连接,要么从 authUrl 获取令牌并与之连接——因此它可能只是忽略其中一个。删除你不想使用的那个。

编辑:我还建议删除禁用 Tls 和更改 http 超时的选项,并将它们保留为默认值。除非您出于某些特殊原因禁用 tls,否则出于安全原因,我们强烈建议您将其保持启用状态。

【讨论】:

是不是在文档中ClientOptions AuthUrl字段只需要token? 当然 - 转到 ably.io/documentation/realtime/usage#client-options 并滚动到 authUrl。我还建议阅读我们的一般身份验证文档(链接在答案中),其中详细解释了可能的身份验证流程。 我们正在从 Ably 获取用于安全连接的令牌,并且已经开始工作了。

以上是关于使用 Ably.io 创建连接时出现未知错误的主要内容,如果未能解决你的问题,请参考以下文章

Mule Anypoint Studio - 测试连接失败 - 进行连接测试时出现未知错误 - 自定义 API

构建matlab gui时出现未知错误

使用 ODBC 使用 msaccess 创建 PHP PDO 连接时出现致命错误

Firebase:处理请求时出现未知错误。再试一次。 [关闭]

为 Kaleido 使用 Websocket 连接时出现“连接未在 send() 上打开”错误

链接 cxx 可执行文件时出现 Cmake 错误未定义引用