尝试同时下载多个PDF时的错误行为

时间:2018-07-24 08:21:19

标签: c#

我有报告列表页面。每个报告都有一个下载按钮。如果单击4-5报告下载按钮,则只会下载最后一个。在下面您可以看到我的代码

public async Task<ActionResult> Download(ReportPage currentPage, string id)
{
    var token = RystadIdentity.Current.AuthenticatedUser.Token;

    try
    {
        DocumentRequestInput documentRequestInput = new DocumentRequestInput(int.Parse(id), 2);
        documentRequestInput.Add(token);
    }
    catch
    { }

    Report report = await RystadGlobal.api.GetReport(token, int.Parse(id));
    string ext = Path.GetExtension(report.fileName);
    byte[] byteArray = await RystadGlobal.api.DownloadReport(token, report.Id);

    if (ext.ToLower() == ".pdf")
    {
        var name = RystadIdentity.Current.AuthenticatedUser.UserInfo.name;
        var company = RystadIdentity.Current.AuthenticatedUser.UserInfo.company;

        try
        {
            byteArray = PdfWatermarker.Watermark(byteArray, name, company);
        }
        catch (Exception ex)
        {
            //Ignore if failed and give the user the pdf anyway
        }
    }

    return File(byteArray, System.Net.Mime.MediaTypeNames.Application.Octet, report.fileName);
}

public async Task<byte[]> DownloadReport(Token token, int reportId)
{
    clientForDownloading.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(token.token_type, token.access_token);

    var result = await clientForDownloading.GetAsync("api/" + ApiVersion + "/LibraryDocument/" + reportId + "/download");

    if (!result.IsSuccessStatusCode)
        throw new ApiException("Could not download the report");

    var contentBytes = await result.Content.ReadAsByteArrayAsync();

    return SevenZipHelper.Decompress(contentBytes);
}


public async Task<Report> GetReport(Token token, int reportId)
{
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(token.token_type, token.access_token);

    var result = await client.GetAsync("api/" + ApiVersion + "/LibraryDocument/" + reportId);

    if (!result.IsSuccessStatusCode)
        throw new ApiException("Could not get report");

    Report report = await result.Content.ReadAsAsync<Report>();

    return report;
}   

有人看到我所缺少的问题吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试像这样同步进行:

public ActionResult Download(ReportPage currentPage, string id)
{
    var token = RystadIdentity.Current.AuthenticatedUser.Token;

    try
    {
        DocumentRequestInput documentRequestInput = new DocumentRequestInput(int.Parse(id), 2);
        documentRequestInput.Add(token);
    }
    catch
    { }

    Report report = RystadGlobal.api.GetReport(token, int.Parse(id)).Result;
    string ext = Path.GetExtension(report.fileName);
    byte[] byteArray = RystadGlobal.api.DownloadReport(token, report.Id).Result;

    if (ext.ToLower() == ".pdf")
    {
        var name = RystadIdentity.Current.AuthenticatedUser.UserInfo.name;
        var company = RystadIdentity.Current.AuthenticatedUser.UserInfo.company;

        try
        {
            byteArray = PdfWatermarker.Watermark(byteArray, name, company);
        }
        catch (Exception ex)
        {
            //Ignore if failed and give the user the pdf anyway
        }
    }

    return File(byteArray, System.Net.Mime.MediaTypeNames.Application.Octet, report.fileName);
}

另一个问题可能在此方法中:

RystadGlobal.api.GetReport(token, int.Parse(id))

我不知道这种方法看起来像里面一样

编辑

尝试使用在问题中添加的方法创建客户的新实例:

public async Task<byte[]> DownloadReport(Token token, int reportId)
{
    using(var clientForDL = new System.Net.Http.HttpClient())
    {    
        clientForDL.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(token.token_type, token.access_token);

        var result = await clientForDL.GetAsync("api/" + ApiVersion + "/LibraryDocument/" + reportId + "/download");

        if (!result.IsSuccessStatusCode)
            throw new ApiException("Could not download the report");

        var contentBytes = await result.Content.ReadAsByteArrayAsync();

        return SevenZipHelper.Decompress(contentBytes);
    }
}


public async Task<Report> GetReport(Token token, int reportId)
{
    using(var clientForGet = new System.Net.Http.HttpClient())
    {
        clientForGet.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(token.token_type, token.access_token);

        var result = await clientForGet.GetAsync("api/" + ApiVersion + "/LibraryDocument/" + reportId);

        if (!result.IsSuccessStatusCode)
            throw new ApiException("Could not get report");

        Report report = await result.Content.ReadAsAsync<Report>();

        return report;
    }
}