如何从Web API传递pdf并从MVC Controller读取pdf? - c#

我有一个应该返回PDF的Web API服务。
然后,我试图调用该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");
        }

当我检查whatisThis变量时,我看到了从我的API正确设置的内容类型和内容贬义。但是我看不到PDF的内容。

如何阅读PDF内容?

编辑:

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

{"Version":{"_Major":1,"_Minor":1,"_Build":-1,"_Revision":-1},"Content":{"Headers":[{"Key":"Content-Disposition","Value":["attachment; filename=MyFile.pdf"]},{"Key":"Content-Type","Value":["application/pdf"]}]},"StatusCode":200,"ReasonPhrase":"OK","Headers":[],"RequestMessage":null,"IsSuccessStatusCode":true}

我逐步完成了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;
}

如何从Web API发布和获取数据uri图像? - javascript

我正在尝试将数据uri图片从javascript发布到后端asp.net webapi。但是,它给了我input is not a valid Base-64 string错误。现在,我知道这可能是由于数据uri包含“ data:image / png; base64”这一部分。现在,即使我从数据uri中删除了这部分并将仅其余字符串发送到服务器,如何将Bas…

jQuery发布不会将数据发布到ASP.NET API控制器 - javascript

我有一次噩梦般的时间通过jquery post将数据发送到ASP.NET Controller。这是JSON.stringify之后的数据:[{"scheduleTaskID":"203","task":"Permit","baselineDate":…

这个json格式正确吗? - c#

我尝试解析时有json数据,返回错误的语法错误,请帮助我发现语法错误。[{"isData":"Yes","Details":"[{"Id":"70","Name":"Test","FileName&#…

.NET C#Webbrowser填充输入,不带ID或类名 - javascript

我需要在网络浏览器中填写一个输入,但这不起作用。我认为必须使用name属性来完成,但是怎么做呢?foreach (HtmlElement login in webBrowser1.Document.GetElementsByTagName("input")) { if (login.GetAttribute("name"…

ddl在服务器中未更新-asp.net - javascript

我在ASP.NET c#上工作。我有一个DropDownList。 (runat =“ server”)在$ {document).ready上,我更新了它的值:$(document).ready(function () { document.getElementById("ddl").value = "abc"; ……