好吧,现在,就在我认为我完成了这个小项目时,他们又抛给了我一条曲线......
我有两个 WCF。一个托管在 IIS 中,另一个托管在不同的服务器上的自承载服务中。
自承载服务中的函数以 Byte() 的形式返回 PDF。IIS 中的 WCF 调用该函数,然后使用 System.IO.FileStream 将 PDF 写入 intepub。aspx 执行回调,并使用显示 pdf 的动态 iFrame 重新加载页面。对我来说效果很好,但对老板来说还不够好。
不知何故,我必须让第二个 WCF 将 PDF 传递回我的 ASP 应用程序,而无需将其保存到磁盘。
我需要这样的东西:
iFrameControl.Attributes.Add("src", ServiceReference1.GetPDF_Byte())
有什么办法可以做到这一点吗?
提前感谢,杰森
如果我理解正确,ASPX 页面中有一些操作会导致对第一个服务(WCF1,托管在 IIS 中)进行调用(可能传递一些参数),而第一个服务又调用第二个服务(WCF2,从不同的机器);WCF1 从 WCF2 检索 PDF,将其本地保存在 inetpub 中,并返回已保存文件的 URL;然后,ASPX 页上的回调调用使用该 URL 在 iFrame 上显示 PDF。
简短的回答:不能使用服务引用来执行所需的操作(ServiceReference1.GetPDF_Byte()) - 控件(或任何 XML)的"src"属性需要是一个字符串,在本例中表示资源的 URL,该 URL 是控件的实际源。但是,您可以使用 WCF 来实现这一点 - 可以使用"原始"模式 (http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-web.aspx) 中的 REST 终结点返回 PDF 文件。
您可以按如下方式更改应用程序的结构:ASPX 页中的某些操作会导致它不直接调用 WCF1,而只是将 iFrame 控件的"src"属性设置为对 WCF1 中的 REST 终结点的调用。此调用将采用参数,并调用 WCF2 以检索 PDF 文件,该调用将直接返回 PDF 文件(作为流)。这样,您就不会产生缓冲解决方案中的缓冲成本(如果许多客户端同时请求页面,则可能会遇到一些内存问题,在这种情况下,您也不需要管理缓冲区生存期)。
在 C 的其他地方找到它并进行转换,在这里发布以防其他人需要它。
答:创建一个新类(Globals.vb)来容纳可以从两个页面访问的字节数组,然后创建一个新页面并执行响应。二进制在页面加载中写入字节数组,并将 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