c# - 上传多个文件时出现 TLSharp 错误

标签 c# asp.net-core telegram

我正在使用 TLSharp。我的目标是将文件发送给用户。我创建了 ASP.NET Core Web API 服务并在需要发送文件时发出 HTTP 请求。

它适用于一个文件,但每次当我在短时间内收到 2 个或更多请求时,我都会收到错误消息:

System.InvalidOperationException: invalid checksum! skip.



Controller :
[Route("upload/{driveId}")]
public async Task<ActionResult> Upload(string driveId)
{
    var ms = new MemoryStream();
    var file = service.Files.Get(driveId);
    string filename = file.Execute().Name;
    await file.DownloadAsync(ms);
    ms.Position = 0;
    new FileExtensionContentTypeProvider().TryGetContentType(filename, out var mime);

    var stream = new StreamReader(ms, true);
    await _client.SendFileToBot(filename, mime, stream, driveId);

    return Ok();
}

SendFileToBot 方法 :
public async Task SendFileToBot(string filename, string mime, StreamReader stream)
{
    var found = await client.SearchUserAsync("username", 1);

    //find user
    var userToSend = found.Users
        .Where(x => x.GetType() == typeof(TLUser))
        .Cast<TLUser>()
        .FirstOrDefault(x => x.Id == 1234567);

    var fileResult = await client.UploadFile(filename, stream);
    var attr = new TLVector<TLAbsDocumentAttribute>()
    {
        new TLDocumentAttributeFilename { FileName = filename }
    };
    var bot = new TLInputPeerUser() { UserId = userToSend.Id, AccessHash = userToSend.AccessHash.Value };
    await client.SendUploadedDocument(bot, fileResult, "caption", mime, attr);
}

当请求一起发送时(或在短时间内),它们以单个数据包的形式发送到 Telegram 服务器并发生此错误。我需要有关此错误的帮助。我试过使用 Task.Delay 但它没有帮助。

如何处理请求以避免此错误?

最佳答案

根据 this问题,您不是第一个收到此错误的人。

在 TLSharp 库中使用多线程时,似乎存在一些请求/响应验证问题。

对于此类问题,有一种稳定的解决方法。

使所有上传请求同步

实际上,它们将是异步的,但具有一次一项任务的访问权限

这个肮脏但可行的解决方案可以通过创建 来实现。任务队列 :

public class TaskQueue
{
    private readonly SemaphoreSlim _semaphoreSlim;

    public TaskQueue()
    {
        _semaphoreSlim = new SemaphoreSlim(1, 1); // Max threads limited to 1.
    }

    public async Task<T> Enqueue<T>(Func<Task<T>> taskGenerator)
    {
        await _semaphoreSlim.WaitAsync();

        try
        {
            return await taskGenerator();
        }
        finally
        {
            _semaphoreSlim.Release();
        }
    }

    public async Task Enqueue(Func<Task> taskGenerator)
    {
        await _semaphoreSlim.WaitAsync();
        try
        {
            await taskGenerator();
        }
        finally
        {
            _semaphoreSlim.Release();
        }
    }
}

现在您必须将队列注册为 单例Startup.cs文件以确保您的 asp.net 核心应用程序使用 一个任务队列在 Telegram 服务器上执行上传的实例:

public void ConfigureServices(IServiceCollection services)
{
    //...
    services.AddSingleton<TaskQueue>();
    //...
}

接下来,在您的 api Controller 构造函数中获取您的任务队列实例,例如:

private readonly TaskQueue taskQueue;

public MyController(TaskQueue taskQueue)
{
    this.taskQueue = taskQueue
}

然后,只需在所有 api 方法中使用它:

// Code from your API method...
await taskQueue.Enqueue(() => client.SendUploadedDocument(bot, fileResult, "caption", mime, attr));

这将使通过 TLSharp 库同步对 Telegram 服务器的所有请求并防止多线程问题,如问题。

老实说,这只是一个解决方法 ,不是 解决方案 这个问题。我敢肯定 this issue on github about checksum error如果可能,必须进行更详细的调查和修复。

关于c# - 上传多个文件时出现 TLSharp 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60378040/

相关文章:

c# - 带有包含图像的 HTML 正文的日历邀请

c# - 为什么服务操作的返回时间比操作中实际代码的执行时间长?

c# - Entity Framework Core 使用 Unique 检查添加多行

asp.net - 用于 ASP.NET Core 2 的 MultipartFormDataStreamProvider

python - 将字典循环Python转换为Json

python - 如何让机器人回复音频消息?

c# - NHibernate 和 AutoMapper 不能正常运行 : "a different object with the same identifier value was already"

c# - 将此 XML 读取到字典的最快/最有效的方法是什么(Linq 或其他?)

c# - Controller 级别的 ASP.NET Core 3.1 中 JsonOutputFormatter 的替代方案

telegram - 用 Telegram Bot 显示表格?