クライアントのブラウザで、バイナリ書き込みを介してiFrame内のCrystalReportsを使用してオンザフライで作成されたPDFをレンダリングするASP.Net4.0Webアプリケーションがあります。Webアプリは私の開発ステーション(Visual Studio 2012 Web Developer)でうまく機能しますが、本番サーバー(Win2003、IIS6)でテストしたところ、ユーザーがボタンをクリックしてPDFをストリーミングする部分は、ドキュメントの一部を表示するだけです。 (ページヘッダーのロゴのみ、PDFの残りの部分は空白です)。テストを行いました。サーバーの仮想パス上のローカルディレクトリに保存したクライアントのブラウザにバイナリデータをストリーミングする代わりに、整合性に問題のないPDFにアクセスでき、すべてのデータが保存されたドキュメントに表示されました。私は3日間グーグルをしていて、あらゆる種類のコードスニペット、IIS構成(ログファイルにエラーは表示されません)、サーバーのアクセス許可、HTMLヘッダー、web.configタグなどを試しました。運がない。IISに関係があるのではないかと思いますが、解決策が見つかりません。クライアントのブラウザでPDFをレンダリングするコードは次のとおりです。
//reportObject is a CrystalReport document object (.rpt)
Dim s As System.IO.MemoryStream = reportObj.ExportToStream(ExportFormatType.PortableDocFormat)
s.Seek(0, SeekOrigin.Begin)
With HttpContext.Current.Response
.ClearContent()
.ClearHeaders()
.ContentType = "application/pdf"
.AddHeader("Content-Disposition", "inline; filename=" & fileName)
.BinaryWrite(s.ToArray)
.Flush()
.End()
End With
私もこれらを試しましたが、すべて私の開発マシンで動作しましたが、サーバーでは動作しませんでした:
With HttpContext.Current.Response
.Clear()
.ClearHeaders()
.Buffer = True
.AddHeader("Content-Disposition", "inline; filename=doc.pdf")
.AddHeader("Content-Length", Int32.Parse(s.Length))
.AddHeader("Content-transfer-encoding", "8bit")
.AddHeader("Cache-Control", "private")
.AddHeader("Pragma", "cache")
.AddHeader("Expires", "0")
.AddHeader("X-UA-Compatible", "IE=EmulateIE7")
.ContentType = "application/pdf"
.BinaryWrite(s.ToArray)
.Flush()
.Close()
HttpContext.Current.ApplicationInstance.CompleteRequest()
End With
また、これらの行:
.AppendHeader("Accept-Ranges", "none")
.OutputStream.Write(s.ToArray(), 0, Convert.ToInt32(s.Length))
何も役に立たないようです。