使用 WebClient 下载 PDF 时遇到问题

Trouble Downloading PDF with WebClient

我们有一个访问外部 API 以获取和下载 PDF 文件的过程。过程如下:

using (var client = new WebClient())
{
    client.BaseAddress = add;
    client.Encoding = System.Text.Encoding.UTF8;
    client.Headers[HttpRequestHeader.ContentType] = "application/pdf";
    client.Headers.Add(HttpRequestHeader.Authorization, "Basic ");
    JObject jobject = generateReportPDFRequest(report.ReportID);
    //string tst = jobject.ToString();
    string result = client.UploadString(add, "POST", jobject.ToString());
    if (!string.IsNullOrEmpty(result))
    {
        retval = AddReportPDF(reportid, Encoding.ASCII.GetBytes(result));
    }
}

public static JObject generateReportPDFRequest(string reportid)
{
    try
    {
        // create the object
        JObject jsonRequest = new JObject();
        // add version property
        jsonRequest.Add("version", "1.0");
        // add content object
        JObject content = new JObject();
        JObject repid = new JObject();
        content.Add("customer-report-id", @"" + reportid + @"");
        content.Add("content-type", "application/pdf");
        JObject reportRequest = new JObject();
        jsonRequest.Add("content", content);
        return jsonRequest;
    }
    catch (Exception e)
    {
        string mess = e.Message;
    }
    return null;
}

我正在尝试使用 Encoding.ASCII.GetBytes(结果)过程获取 PDF,该过程是 return,WebClient 上传字符串 post。流被转换为字节数组并保存到数据库中。但是文件是空的。

有人告诉我,我将文件保存为 1.6 版,而下载的是 1.4 版。如果这是问题所在,我该如何定义 PDF 版本?如果没有,如何正确获取这些 PDF 文件?

如果您不想返回字符串,请不要使用 UploadString。有一个适当的重载 UploadData returns 你是一个 byte[] 数组。这样可以防止发生任何 encoding/decoding 事故的风险。

按如下方式调整您的代码:

using (var client = new WebClient())
{
    client.BaseAddress = add;
    client.Headers[HttpRequestHeader.ContentType] = "application/pdf";
    client.Headers.Add(HttpRequestHeader.Authorization, "Basic ");
    JObject jobject = generateReportPDFRequest(report.ReportID);

    byte[] result = client.UploadData(
                        add, 
                        "POST", 
                        Encoding.UTF8.GetBytes(jobject.ToString()));

    retval = AddReportPDF(reportid, result);
}