【问题标题】:TLSharp Data center (dc) ExceptionTLSharp 数据中心 (dc) 异常
【发布时间】:2017-03-27 20:59:13
【问题描述】:

我正在使用 TLSharp 库来实现自定义 Telegram 客户端。当我运行下面的代码时:

public async Task<string> SendCodeRequest(string phoneNumber)
    {
        var completed = false;

        TL.AuthSendCodeRequest request = null;

        while (!completed)
        {
            request = new TL.AuthSendCodeRequest(phoneNumber, 5, _apiId, _apiHash, "en");
            await _sender.Send(request);
            await _sender.Receive(request);

            completed = true;
        }

        // TODO handle other types (such as SMS)
        if (request.Result is TL.AuthSentCodeType)
        {
            var result = (TL.AuthSentCodeType)request.Result;
            return result.PhoneCodeHash;
        }
        else
        {
            var result = (TL.AuthSentAppCodeType)request.Result;
            return result.PhoneCodeHash;
        }

    }

我给了我以下例外:

您在 {dcIdx} dc 注册的电话号码。请更新设置。 见https://github.com/sochix/TLSharp#i-get-an-error-migrate_x 详情。

提到的 github 页面说 TLSharp 自己处理这些异常。所以我猜库核心出了点问题,因为代码应该自己解析数据中心 IP 而不会产生异常。

任何帮助将不胜感激。

【问题讨论】:

    标签: c# api telegram


    【解决方案1】:

    TlSharp 目前不处理此异常,您必须捕获异常并获取数据中心编号,然后尝试使用 ReconnectToDc() 函数重新连接到数据中心。

    MtProtoSender.cs 文件中,您可以找到以下生成异常的代码行:

    throw new InvalidOperationException($"Your phone number registered to {dcIdx} dc. Please update settings. See https://github.com/sochix/TLSharp#i-get-an-error-migrate_x for details.");
    

    将其替换为以下代码,以便生成的异常具有连接到它所需的数据中心编号。

    InvalidOperationException exception = new InvalidOperationException($"Your phone number registered to {dcIdx} dc. Please update settings. See https://github.com/sochix/TLSharp#i-get-an-error-migrate_x for details.");
    exception.Data.Add("dcId", dcIdx);
    throw exception;
    

    像这样更改您的代码:

    while (!completed)
    {
        request = new TL.AuthSendCodeRequest(phoneNumber, 5, _apiId, _apiHash, "en");
        try
        {
            await _sender.Send(request);
            await _sender.Receive(request);
    
            completed = true;
        }
        catch (InvalidOperationException ex)
        {
            if (ex.Message.StartsWith("Your phone number registered to") && ex.Data["dcId"] != null)
            {
                await ReconnectToDc((int)ex.Data["dcId"]);
            }
            else
            {
                throw;
            }
        }
    }
    

    在上面的代码中,附加到异常的数据中心编号用于重新连接到数据中心。

    【讨论】:

      【解决方案2】:

      您的电话号码可能不是 Telegram 接受的格式。

      电话号码必须以加号开头,国家代码和电话号码不能有空格,例如:+989333333333

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多