C# 如何从WebAPI传递pdf并从MVC控制器读取pdf?

C# 如何从WebAPI传递pdf并从MVC控制器读取pdf?,c#,asp.net-mvc,asp.net-web-api,C#,Asp.net Mvc,Asp.net Web Api,我有一个Web API服务,应该返回PDF。 然后我尝试调用WebAPI方法来读取PDF 以下是我的API方法: [HttpPost] [Route("GetTestPDF")] public HttpResponseMessage TestPDF() { HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK); response.Conte

我有一个Web API服务,应该返回PDF。
然后我尝试调用WebAPI方法来读取PDF

以下是我的API方法:

    [HttpPost]
    [Route("GetTestPDF")]
    public HttpResponseMessage TestPDF()
    {
        HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
        response.Content = new StreamContent(new FileStream(@"C:\MyPath\MyFile.pdf", FileMode.Open, FileAccess.Read));
        response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
        response.Content.Headers.ContentDisposition.FileName = "MyFile.pdf";
        response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/pdf");

        return Request.CreateResponse(HttpStatusCode.OK, response);
    }
但是,当我阅读回复时,我看不到pdf内容。我不知道我在这方面哪里出了问题

控制器方法:

public ActionResult GetPDF()
        {
            var response = new HttpResponseMessage();

            using (HttpClient httpClient = new HttpClient())
            {
                httpClient.BaseAddress = new Uri(@"my local host");                               
                response = httpClient.PostAsync(@"api/job/GetTestPDF", new StringContent(string.Empty)).Result;
            }

            var whatisThis = response.Content.ReadAsStringAsync().Result;
            return new FileContentResult(Convert.FromBase64String(response.Content.ReadAsStringAsync().Result), "application/pdf");
        }
当我检查这个变量时,我看到内容类型和内容配置从API中正确设置。但是我没有看到PDF的内容

如何阅读PDF内容

编辑:

如果我在MVC站点中以字符串形式阅读内容,我会看到。(我看不到文件的实际内容)

我逐步浏览了WebAPI,它成功地读取并设置了response.Content和文件内容


仍然不确定这是WebAPI方面的问题还是MVC方面的问题。

我将首先将此作为答案发布,因为格式化代码更容易
我创建了一个API端点来返回PDF文件,如果我从浏览器调用它,该文件将按预期打开。
由于您的API似乎没有做到这一点,让我们假设问题就在那里,因此就是这样

以下是端点代码,与您的非常相似,但缺少ContentDisposition内容:

public HttpResponseMessage Get()
{
    HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
    FileStream fileStream = File.OpenRead("FileName.pdf");
    response.Content = new StreamContent(fileStream);
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");

    return response;
}

如果您使用API方法httpget并从浏览器中调用它,pdf是否按预期打开或下载,并作为pdf工作?FileContentResult的构造函数似乎采用字节数组,并且您可以读取响应内容,因此,您可以这样做,而不是以字符串形式读取:
返回新的FileContentResult(response.Content.ReadAsByteArrayAsync().Result,“application/pdf”)
Hmm。除了文档的实际内容之外,我看到了所有内容。我确实更改了建议的文档,但出现了一个错误文档不是以%pdfAlso开头的,因此尝试更改API以获取。我也遇到了同样的问题。您可以从浏览器调用获取端点吗?它是否正确显示/下载?谢谢您的操作。我必须进一步检查。我按原样测试并运行。然后我通过添加ContentDisposition重新测试,结果成功了。@Craig H嘿,我有个问题,如果我们从android应用程序调用它,它能正常工作吗,意味着在android应用程序中打开吗?嘿,还有一件事需要帮助,这里您只定义了“FileNAme.pdf”但如果您将pdf放入目录中,请使用以下代码。字符串fileName=System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory.ToString()++@“Documents\test.pdf”);在这里,我在vs2017项目中创建了Documents文件夹,我的pdf名称为test.pdf。如果您使用web API,这一行代码是特定的。
public HttpResponseMessage Get()
{
    HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
    FileStream fileStream = File.OpenRead("FileName.pdf");
    response.Content = new StreamContent(fileStream);
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");

    return response;
}