我有一个在服务器上运行的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)