Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C#到Angular2视图显示PDF文件_C#_Angular_Pdf_Itext - Fatal编程技术网

从C#到Angular2视图显示PDF文件

从C#到Angular2视图显示PDF文件,c#,angular,pdf,itext,C#,Angular,Pdf,Itext,我正在尝试显示以前上载到服务器的PDF。PDF位于App_数据文件夹中。我想使用C#WebAPI 2获取它,并在Angular 2前端视图中显示它 C#代码: 角度2代码: this.documentsService.getFile() .subscribe((response: any) => { let file = new Blob([response], { type: 'application/pdf' })

我正在尝试显示以前上载到服务器的PDF。PDF位于App_数据文件夹中。我想使用C#WebAPI 2获取它,并在Angular 2前端视图中显示它

C#代码:

角度2代码:

this.documentsService.getFile()
                .subscribe((response: any) => {
                    let file = new Blob([response], { type: 'application/pdf' });
                    let url = URL.createObjectURL(file);
                    window.open(url);
                });
我想我的角度代码错了。但无论如何,我的第一个目标是从MVC方面获得它。现在该文件被下载,并且已损坏或无法正确获取。它总是给我一个15字节大小的PDF文件,所以我知道有问题。我在C#后端使用iTextSharp

提前谢谢

根据我的评论(对于代码来说,提供答案更容易):

编辑:我上面发布的代码适合我。唯一的问题是处理流。最好的方法可能是在控制器类上创建一个私有IDisposable成员,然后添加一个dispose覆盖,类似这样:

private IDisposable _myDisposable;
public override void Dispose(bool disposing)
{
    if (disposing && _myDisposable != null)
        _myDisposable.Dispose();
}
请注意,这假设ASP.NET完成了请求(这似乎合理,因为它正在处理您的控制器),这应该是正确的。

根据我的评论(提供答案对于代码来说更容易):

编辑:我上面发布的代码适合我。唯一的问题是处理流。最好的方法可能是在控制器类上创建一个私有IDisposable成员,然后添加一个dispose覆盖,类似这样:

private IDisposable _myDisposable;
public override void Dispose(bool disposing)
{
    if (disposing && _myDisposable != null)
        _myDisposable.Dispose();
}


请注意,这假设ASP.NET处理了请求(这似乎是合理的,因为它正在处理您的控制器),这应该是正确的。

在返回响应之前,缓冲区的长度是多少?实际上我不知道这是如何工作的,所以我真的不知道。抱歉。为什么不换成使用文件API,只打开PDF文件,然后返回二进制流呢?从那里,看看你是否可以用你的网络浏览器打开它。请确保MIME类型正确-我相信它应该是application/pdf或application/octet@PSGuy您能展示一个示例代码吗?@Jed,请看我的答案。对我有用。我不能和Angular说话,但我知道控制器代码可以工作。在返回响应之前,缓冲区的长度是多少?实际上我不知道它是如何工作的,所以我真的不知道。抱歉。为什么不换成使用文件API,只打开PDF文件,然后返回二进制流呢?从那里,看看你是否可以用你的网络浏览器打开它。请确保MIME类型正确-我相信它应该是application/pdf或application/octet@PSGuy您能展示一个示例代码吗?@Jed,请看我的答案。对我有用。我不能和Angular说话,但我知道控制器代码是有效的。是的,这对我有效。我能处理有棱角的部分。谢谢谢谢你接受:)请留心那个一次性的东西。。当我不拥有对Dispose方法的调用时,我总是有点紧张:我已经更新了这个答案,以展示在资源流打开后如何处理它的处置。希望它能帮助一些人:)为什么不在流上使用
using
语句
using(MemoryStream ms=new MemoryStream())
using语句通常是个好主意,但举个例子,我认为它实际上不起作用,因为响应流不一定在控制器操作中立即写入,它稍后将在ASP.NET管道中编写。对于这个特定的示例,这可能不是真的,但是当直接从控制器返回实体框架查询而不调用
.ToList()
扩展方法时,这肯定是真的。所以,我的一般建议是获得一次性的,在控制器中设置,最后处理。是的,这对我很有效。我能处理有棱角的部分。谢谢谢谢你接受:)请留心那个一次性的东西。。当我不拥有对Dispose方法的调用时,我总是有点紧张:我已经更新了这个答案,以展示在资源流打开后如何处理它的处置。希望它能帮助一些人:)为什么不在流上使用
using
语句
using(MemoryStream ms=new MemoryStream())
using语句通常是个好主意,但举个例子,我认为它实际上不起作用,因为响应流不一定在控制器操作中立即写入,它稍后将在ASP.NET管道中编写。对于这个特定的示例,这可能不是真的,但是当直接从控制器返回实体框架查询而不调用
.ToList()
扩展方法时,这肯定是真的。因此,我的一般建议是获取一次性产品,将其设置在控制器中,最后进行处理。
private IDisposable _myDisposable;
public override void Dispose(bool disposing)
{
    if (disposing && _myDisposable != null)
        _myDisposable.Dispose();
}