小编Doc*_*r93的帖子

如何从Web API应用程序返回PDF

我有一个在服务器上运行的Web API项目.它应该从两种不同的源返回PDF:实际的可移植文档文件(PDF)和存储在数据库中的base64字符串.我遇到的麻烦是将文档发送回客户端MVC应用程序.其余的是关于所发生的一切的细节,我已经尝试过了.

我编写的代码成功地将这两种格式转换为C#代码,然后(返回)转换为PDF格式.我已经成功传输了一个应该代表其中一个文档的字节数组,但我无法在浏览器中显示它(在一个新的选项卡中).我总是得到某种"无法显示"的错误.

最近,我找到了一种方法来查看服务器端的文档,以确保我至少可以做到这一点.它将文档放入代码中并使用它创建一个FileStreamResult,然后它作为(隐式转换)ActionResult返回.我得到了它返回到服务器端MVC控制器并将其扔进一个简单的返回(没有视图),在浏览器中显示PDF.但是,尝试简单地直接使用Web API函数只会返回看起来像FileStreamResult的JSON表示的内容.

当我试图让它正确返回到我的客户端MVC应用程序时,它告诉我"_buffer"不能直接设置.一些错误消息,表明返回并抛入对象的某些属性是私有的,无法访问.

当转换为base64字符串时,上述PDF的字节数组表示似乎与FileStreamResult在JSON中返回的"_buffer"字符串具有相同的字符数.它最终缺少大约26k'A'.

有关如何正确返回此PDF的任何想法?我可以在必要时提供代码,但必须有一些已知的方法将PDF从服务器端Web API应用程序返回到客户端MVC应用程序并在浏览器中将其显示为网页.

PS我知道"客户端"应用程序在技术上不是客户端.它也将是一个服务器应用程序,但在这种情况下无关紧要.相对于Web API服务器,我的MVC应用程序是"客户端".

获取pdf的代码:

private System.Web.Mvc.ActionResult GetPDF()
{
    int bufferSize = 100;
    int startIndex = 0;
    long retval;
    byte[] buffer = new byte[bufferSize];
    MemoryStream stream = new MemoryStream();
    SqlCommand command;
    SqlConnection sqlca;
    SqlDataReader reader;

    using (sqlca = new SqlConnection(CONNECTION_STRING))
    {
        command = new SqlCommand((LINQ_TO_GET_FILE).ToString(), sqlca);
        sqlca.Open();
        reader = command.ExecuteReader(CommandBehavior.SequentialAccess);
        try
        {
            while (reader.Read())
            {
                do
                {
                    retval = reader.GetBytes(0, startIndex, buffer, 0, bufferSize);
                    stream.Write(buffer, 0, bufferSize);
                    startIndex += bufferSize;
                } …
Run Code Online (Sandbox Code Playgroud)

c# pdf asp.net asp.net-mvc-5 asp.net-web-api2

23
推荐指数
1
解决办法
6万
查看次数

标签 统计

asp.net ×1

asp.net-mvc-5 ×1

asp.net-web-api2 ×1

c# ×1

pdf ×1