HTTPS

2017-01-04 6 views
0
以上のaspx/ASHX

として保存されたPDF私はブラウザ上でバイナリデータからPDFを表示するASHXハンドラを持って、私は.NET Frameworkの4.0を使用していますが、6およびChromeブラウザをIIS:HTTPS

 Dim s As System.IO.MemoryStream = HttpContext.Current.Session("tmp_binaryData") 
     s.Seek(0, System.IO.SeekOrigin.Begin) 

     With HttpContext.Current.Response 
      .ClearContent() 
      .ClearHeaders() 
      .ContentType = "application/pdf" 
      .AddHeader("Content-Disposition", "inline; filename='test.pdf'") 
      .BinaryWrite(s.ToArray) 
      .Flush() 
     End With 

アクセスした場合HTTPSからユーザーがファイルを保存しようとすると(PDFビューアのツールバーから保存ボタンをクリックすると)、ファイルはashxとして保存され、pdfでは保存されません。これは、HTTP(ポート80)からWebアプリケーションにアクセスする場合は発生しません。

ContentTypeを「attachment/pdf」に変更すると、ファイルは自動的にPDFとして正しく保存されます。

すべての種類のヘッダーの組み合わせを使用して成功していない、ChromeのPDFビューアーを無効にした、Adobe Readerを試した、IISのファイル圧縮オプションを確認した、検証済みのMIMEタイプ、

追加情報として、別のサーバー上のIIS7でホストされている別のWebアプリケーションでこの同じテクニックを使用していますが、この問題は存在しないため、IIS 6構成に関係するものがあります。

UPDATE月/ 05/2017

私は本番サーバー上Response.Redirect("test.pdf")を経由してファイルからテストPDFファイルをロードしているとファイルがChromeで成功裏に保存されます。

のResponse.Redirect()メソッド:

headers=" 
Accept-Ranges: bytes 
Content-Length: 696505 
Content-Type: application/pdf 
Date: Thu, 05 Jan 2017 18:05:09 GMT 
ETag: "33dad7f8baccd11:11a1" 
Last-Modified: Wed, 22 Jun 2016 19:19:18 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET" 

ASHXハンドラ(filestram)方法:だから、私は両方の表示方法のヘッダ比較

headers=" 
Cache-Control: private 
Content-Disposition: inline; filename='Prueba.pdf' 
Content-Type: application/pdf 
Date: Thu, 05 Jan 2017 18:09:58 GMT 
Server: Microsoft-IIS/6.0 
Transfer-Encoding: chunked 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET" 

を私が気づいASHXメソッドは "Accept-Range"と "Content-Lenght"ヘッダーが欠落していますが、 "Transfer-Encoding:chunked"ヘッダーがあることに気付きました。これが問題の原因になると思いますか?私はASHXの最初のメソッドヘッダーを複製しようとします。

Dim s As System.IO.MemoryStream = HttpContext.Current.Session("tmp_binaryData")    
Dim serverPath As String = "~/temp/" 

System.IO.File.WriteAllBytes(HttpContext.Current.Server.MapPath(serverPath + HttpContext.Current.Session("tmp_fileName")), s.ToArray()) 
HttpContext.Current.Response.Redirect((serverPath + HttpContext.Current.Session("tmp_fileName"))) 

これら生成されたファイルは、セッションの終了時に削除する必要があります。

答えて

0

まあ、私は、サーバー上の物理的にPDFファイルを生成し、その後のResponse.Redirect()で、クライアントのブラウザに送信する必要がありましたまたは期限が切れます。これはGlobal.asaxで実行できます。

もう1つのワークアラウンドは元の方法(ブラウザにバイトを書き込む)を使用し、保存ボタンをクリックする代わりに、ユーザーが印刷ボタンをクリックしてPDFファイルを保存します。