那么现在,就在我认为我完成这个小项目的时候,他们又给我一条曲线......
我有两个WCF。一个托管在IIS中,另一个托管在另一台服务器上的自托管服务中。
自托管服务中的函数以Byte()的形式返回PDF。 IIS中的WCF调用该函数,然后使用System.IO.FileStream将PDF写入intepub。 aspx执行回调,页面重新加载显示pdf的动态iFrame。对我来说足够好,但对老板来说还不够好。
不知何故,我必须让第二个WCF将PDF传回我的ASP应用程序而不将其保存到磁盘。
我需要类似的东西:
iFrameControl.Attributes.Add("src", ServiceReference1.GetPDF_Byte())
有什么办法吗?
提前致谢, 杰森
答案 0 :(得分:1)
如果我理解正确,ASPX页面中会有一些操作导致调用(可能传递一些参数)到第一个服务(WCF1,在IIS中托管),后者又调用第二个服务( WCF2,来自不同的机器); WCF1从WCF2检索PDF,将其保存在inetpub本地,并返回保存文件的URL;然后,ASPX页面上的回调调用使用该URL在iFrame上显示PDF。
一个简短的回答:你不能使用服务引用来做你需要的(ServiceReference1.GetPDF_Byte()) - 控件(或任何XML)的“src”属性需要是一个字符串,在这种情况表示资源的URL,该资源是控件的实际源。但是,您可以使用WCF实现 - “原始”模式下的REST端点(http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model -web.aspx)可用于返回PDF文件。
您将按如下方式更改应用程序的结构:ASPX页面中的某些操作导致它不直接调用WCF1,而只是将iFrame控件的“src”属性设置为调用到WCF1中的REST端点。此调用将获取参数,并调用WCF2以检索PDF文件,该调用将直接返回PDF文件(作为Stream)。这样,您不会产生缓冲解决方案中的缓冲成本(如果许多客户端同时请求页面,您可能会遇到一些内存问题,在这种情况下,您无需管理缓冲区生命周期)。
答案 1 :(得分:0)
在C的其他地方找到它并进行转换,发布此处以防万一其他人需要它。
答案:创建一个新类(Globals.vb)来容纳一个可以从两个页面访问的字节数组,然后创建一个新页面并进行响应.Binary在页面加载中写入你的字节数组,并设置iFrame的src到新的(空白)页面。
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Response.Clear()
Response.Buffer = True
Response.ContentType = "application/pdf"
Response.BinaryWrite(Globals.PDF_Data.ToArray)
End Sub