質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

1回答

10613閲覧

ASP.NETでのストリーム経由でのPDF出力について

ubon

総合スコア68

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2017/06/26 04:28

編集2017/07/08 04:13

Window10 Pro 64bit バージョン 1703 OSビルド 15063.413
Chrome/IE11 VS2013 Community Update5環境において
CrystalReportsにてASP.NETのプログラムを作成しております。

子ウインドウ(A)から、さらにPDF出力用の子ウインドウ(B)をOpenし、
下記の記事を参考に、javascriptによってwindow.open直後に
POSTをするという方法でパラメータを渡して
PDFをストリーム経由で(B)に出力するというプログラムを作成していたところ
Chromeでは問題ないのですが、IE11(11.413.15063.0)では子ウインドウは開くものの
画面が真っ白のまま読み込みが終了してしまいます。

http://qiita.com/tsunet111/items/0167704a65ebc04411f9
※試しにWindows7 32bit のIE11では動作いたしました。

そこで、POSTをやめてGETにてwindow.openをすると
Windows10 IE11で表示されたため、「子ウインドウを開き、POSTする」
というjavascriptの処理の中で対応が必要か?というところで
行き詰っております。

本件CrystalReportsは記載させていただいておりますが
関係ないと判断しております。その根拠としては
・Windows7環境ではChrome/IE11ともに動作確認済みのrptファイルと
PDF出力のロジックをそのまま利用して、window.openの部分を切り替えることによって
現象が発生するかしないかが切り替わることを確認したためです。


2017.06.29 コードを修正しました。
base.aspxをスタートアップとし、baseにあるボタンから、out.aspxでストリーム出力させるサンプルコードです。
<base.aspx> base.aspx.vbファイルは編集無し

lang

1<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="base.aspx.vb" Inherits="WebApplication1.base" %> 2 3<!DOCTYPE html> 4 5<html xmlns="http://www.w3.org/1999/xhtml"> 6<head runat="server"> 7<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 8 <meta http-equiv="content-language" content="ja" /> 9 <meta http-equiv="x-ua-compatible" content="IE=10" /> 10 <meta http-equiv="x-ua-compatible" content="IE=EmulateIE10" /> 11<title>output test</title> 12 <script src="jquery.min.js" type="text/javascript"></script> 13 14 <script type="text/javascript"> 15 $(function () { 16 17 $('#btn_ok').click(function () { 18 19 window.open('out.aspx?type=hist&rpt_hidP=' + 'dummy', '_blank'); 20 21 }); 22 23 $('#btn_dame').click(function () { 24 25 window.open('', 'report'); 26 27 var form = $('<form/>', { 28 id: 'rpt_p', 29 action: 'out.aspx?type=hist', 30 target: 'report', 31 method: 'post' 32 }).append($('<input/>').attr({ 33 type: 'hidden', 34 id: 'rpt_hidP', 35 name: 'rpt_hidP', 36 value: 'dummy' 37 }) 38 ); 39 40 $('body').append(form); 41 42 $('#rpt_p').submit(); 43 $('#rpt_p').remove(); 44 45 form = null; 46 47 }); 48 49 }); 50 </script> 51</head> 52<body> 53 <form id="form1" runat="server"> 54 <div> 55 56 <input type="button" id="btn_ok" value="OKパターン" /> 57 58 <input type="button" id="btn_dame" value="ダメパターン" /> 59 60 </div> 61 </form> 62</body> 63</html> 64

<out.aspx.vb> ※out.aspxは特に編集無し。sample.pdfは1ページの簡単なpdfを使用。

lang

1Imports System 2Imports System.IO 3 4Public Class out 5 Inherits System.Web.UI.Page 6 7 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 8 9 Response.Cache.SetCacheability(HttpCacheability.NoCache) 10 Response.Cache.SetNoStore() 11 12 Dim bLength As Byte() 13 14 'ファイルを開く 15 Dim fs As New System.IO.FileStream(HttpContext.Current.Server.MapPath("pdf/sample.pdf"), System.IO.FileMode.Open, System.IO.FileAccess.Read) 16 17 'ファイルを読み込むバイト型配列を作成する 18 ReDim bLength(fs.Length) 19 'ファイルの内容をすべて読み込む 20 fs.Read(bLength, 0, Convert.ToInt32(bLength.Length)) 21 '閉じる 22 fs.Close() 23 24 Response.ClearHeaders() 25 Response.ClearContent() 26 Response.ContentType = "Application/pdf" 27 28 ' ダイアログ表示 29 Response.AddHeader("content-disposition", "inline; filename=" & System.Web.HttpUtility.UrlEncode("sample.pdf")) 30 31 ' HTTP 出力ストリームに書き込み 32 Response.BinaryWrite(bLength) 33 Response.End() 34 35 End Sub 36 37End Class

OKパターン ボタン 結果
Windows10 64bit Chrome ○ IE11 ○
Windows7 32bit Chrome ○ IE11 ○

ダメパターン ボタン 結果
Windows10 64bit Chrome ○ IE11 ×
Windows7 32bit Chrome ○ IE11 ○

上記のサンプルでも再現することからもrptは関係ないと思われます。

さらに、SurferOnWwwさんからアドバイスいただいたようにFiddlerでキャプチャした結果

OKパターンのキャプチャ
リクエストヘッダー GET /out?type=hist&rpt_hidP=dummy HTTP/1.1
レスポンスヘッダー HTTP/1.1 200 OK

ダメパターンのキャプチャ
リクエストヘッダー POST /out.aspx?type=hist HTTP/1.1
レスポンスヘッダー HTTP/1.1 301 Moved Permanently となり下記のような
HTMLが出力された後 Location: /out?type=hist でリダイレクトされているという違いが明らかになりました。

html

1<html><head><title>Object moved</title></head><body> 2<h2>Object moved to <a href="/out?type=hist">here</a>.</h2> 3</body></html>

Chromeでも同様のキャプチャ結果となりましたが、動作しております。

パラメータが多くなる可能性があるため、できればPOSTで解決したいと
考えております。
対応方法ご存知の方、どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/06/26 04:46

Crystal Report が今回の問題と関係があるのか否か質問者さんの方で切り分けできませんか? 関係なければ、Crystal Report 無しで問題を再現できる必要最低限のサンプルコードをアップできないでしょうか? そうしてもらえることによって回答者の方でも問題を再現できるので、回答が得られやすくなると思います。(なんとなく Windows 10 の IE11 で強化されたセキュリティ対策が原因のような気がしますが・・・)
ubon

2017/06/26 05:16

アドバイスありがとうございます。質問を編集させていただきます。
退会済みユーザー

退会済みユーザー

2017/06/26 07:17

たびたびのお願いですみません。「うまくいかないパターン」で、Windows 10 IE11 とその他のブラウザで要求・応答の違いを Fiddler などのキャプチャツールで比較してみてはいかがでしょう? 期待した POST 要求が出ているか、応答が返ってきているか、応答の内容はどうなっているかがわかると、何かヒントが得られるかもしれません。
退会済みユーザー

退会済みユーザー

2017/06/26 08:01

質問者さんがアップされた「うまくいかないパターン」をそのままコピペして試しても動かないですよね?(実際、念のため、やってみましたが動きません。IE11 は初期画面表示後ポップアップブロックに引っかかって、許可すると別の Window がオープン、Chrome は初期画面表示後は無反応)
ubon

2017/06/26 08:31

たびたびのアドバイスありがとうございます。まずはFiddlerで内容確認してみます。ソースは部分的な抜粋です。
退会済みユーザー

退会済みユーザー

2017/06/26 08:40

部分的な抜粋でもいいですが、ちゃんと動いて問題を再現できるものでないと意味がないです。同じコードを回答者の方でも動かして問題を再現しようとしているわけですから。
退会済みユーザー

退会済みユーザー

2017/06/26 08:42

先に「Chrome は初期画面表示後は無反応」と書きましたが、それは Chrome のデフォルト設定で警告なしでポップアップをブロックしていたからでした。ポップアップブロックを解除すれば IE と同じ結果になります。
guest

回答1

0

何故リダイレクトされるのかの原因は自分はまだ追究できていませんが、その前に確認させてください。

質問者さんが、「ダメパターン ボタン 結果」で、〇 印のブラウザでも「同様のキャプチャ結果」になるのですよね?

つまり、〇 印のブラウザは、サーバーから 301 応答が返ってきた後、応答ヘッダの Location で示された URL を GET 要求にいくのですよね。(リダイレクトの仕組みから GET 要求になるはず)

で、IE11 × の場合はどうなるのでしょう? ブラウザから要求が出ない? サーバーから応答が返ってこない? 応答が返ってきてもブラウザで処理されない?

何にせよ、「ダメパターン ボタン 結果」で 〇 のブラウザでも、リダイレクト後 GET 要求ということになっているのであれば(リダイレクトの仕組みから GET 要求になるはず)、

パラメータが多くなる可能性があるため、できればPOSTで解決したい

ということは、少なくとも今のやり方ではできてないということになるはずなのですが、そこを確認してください。

(根本的にやり方を変えないとダメということになりそうな気がします)

----- 2017/6/29 16:34 追記 -----

下の 2017/06/29 15:48 の私のコメントで「自分の環境と検証に使ったコードその他の情報を回答欄に書いておきます」と書きましたが、それを以下に書いておきます。

環境:
Visual Studio Commnuty 2015 Update 3
ASP.NET Web Forms(Web サイトプロジェクトとして作成、IIS のサイトに設定)
.NET Framework 4.6.1
Windows 10 Pro 64-bit, 10.0.14393 ビルド 14393
IIS 10.0, CLR v4.0, 64-bit, 統合パイプラインモード
IE11 ver. 11.1358.14393.0 更新 ver. 11.0.43 (KB4021558)

ソースコード

**base.aspx **に該当するもの。コードビハインド形式にせず一体にしています。

<%@ Page Language="C#" %> <!DOCTYPE html> <script runat="server"> </script> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <script src="/Scripts/jquery-1.10.2.js"></script> <script type="text/javascript"> //<![CDATA[ $(function () { $('#btn_ok').click(function () { window.open('0008-out.aspx', '_blank'); }); $('#btn_dame').click(function () { window.open('', 'report'); var form = $('<form/>', { id: 'rpt_p', action: '0008-out.aspx', target: 'report', method: 'post' }); $('body').append(form); $('#rpt_p').submit(); $('#rpt_p').remove(); }); }); //]]> </script> </head> <body> <form id="form1" runat="server"> <div> <h1>window.open で開いたウィンドウに pdf をダウンロード</h1> <input type="button" id="btn_ok" value="GET" /> <input type="button" id="btn_dame" value="POST" /> </div> </form> </body> </html>

out.aspx.vb に該当するもの。言語は C# です。(ページの名前は 0008-out.aspx としています)

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class _0008_out : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.Cache.SetNoStore(); Response.ClearHeaders(); Response.ClearContent(); Response.ContentType = "Application/pdf"; Response.AddHeader("content-disposition", "inline; filename=sample.pdf"); string path = Server.MapPath("~/app_data/sample.pdf"); Response.TransmitFile(path); Response.End(); } }

上記 base.aspx の[POST]ボタンをクリックしたとき、Fiddler で見た要求と応答

要求 (コンテンツは設定してないので空です)

POST http://websiteproject.com/0008-out.aspx HTTP/1.1 Accept: text/html, application/xhtml+xml, image/jxr, */* Referer: http://websiteproject.com/0008-AutoPostByScript.aspx Accept-Language: ja User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate Content-Length: 0 Host: websiteproject.com Connection: Keep-Alive Pragma: no-cache

応答

HTTP/1.1 200 OK Cache-Control: private Content-Type: Application/pdf Server: Microsoft-IIS/10.0 content-disposition: inline; filename=sample.pdf X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Thu, 29 Jun 2017 07:12:49 GMT Content-Length: 73552 %PDF-1.4 %äüöß 2 0 obj <</Length 3 0 R/Filter/FlateDecode>> stream ・・・以下省略・・・

投稿2017/06/29 01:26

編集2017/06/29 07:34
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ubon

2017/06/29 01:50

回答ありがとうございました。説明不足でもうしわけありませんでした。ダメパターンのIE11でのキャプチャ結果も同様でした。 ちなみにIE11×でのRawデータを掲載させていただきます。 ''' POST http://localhost:51067/out.aspx?type=hist HTTP/1.1 Accept: text/html, application/xhtml+xml, image/jxr, */* Referer: http://localhost:51067/base Accept-Language: ja User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate Content-Length: 14 Host: localhost:51067 Connection: Keep-Alive Pragma: no-cache rpt_hidP=dummy ''' ''' HTTP/1.1 301 Moved Permanently Location: /out?type=hist Server: Microsoft-IIS/10.0 X-SourceFiles: =?UTF-8?B?RTpcRG9jdW1lbnRzXFZpc3VhbCBTdHVkaW8gMjAxM1xQcm9qZWN0c1xXZWJBcHBsaWNhdGlvbjFcV2ViQXBwbGljYXRpb24xXG91dC5hc3B4?= X-Powered-By: ASP.NET Date: Wed, 28 Jun 2017 08:39:30 GMT Content-Length: 131 <html><head><title>Object moved</title></head><body> <h2>Object moved to <a href="/out?type=hist">here</a>.</h2> </body></html> ''' リダイレクトされて ''' GET http://localhost:51067/out?type=hist HTTP/1.1 Accept: text/html, application/xhtml+xml, image/jxr, */* Referer: http://localhost:51067/base Accept-Language: ja User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko Accept-Encoding: gzip, deflate Host: localhost:51067 Connection: Keep-Alive Pragma: no-cache ''' ''' HTTP/1.1 200 OK Cache-Control: private Content-Type: Application/pdf Server: Microsoft-IIS/10.0 content-disposition: inline; filename=sample.pdf X-AspNet-Version: 4.0.30319 X-SourceFiles: =?UTF-8?B?RTpcRG9jdW1lbnRzXFZpc3VhbCBTdHVkaW8gMjAxM1xQcm9qZWN0c1xXZWJBcHBsaWNhdGlvbjFcV2ViQXBwbGljYXRpb24xXG91dA==?= X-Powered-By: ASP.NET Date: Wed, 28 Jun 2017 08:39:30 GMT Content-Length: 241317 %PDF-1.7 // -- 以下PDFのデータと思われる為、省略 -- // ''' 上記のようなレスポンスが返ってくるのですが、画面は真っ白になります。 ですので1回目のリクエストに対して301が返る原因が分かれば解決できるのかもと思っております。 ちなみに Response.ContentType の前に Response.StatusCode = 200 と記述してみても状況はかわりませんでした。
退会済みユーザー

退会済みユーザー

2017/06/29 02:06 編集

ダメパターンの IE11× でも、応答が返ってくるところまでは 〇 のブラウザと全く同じ(返ってきたヘッダもコンテンツも全く同じ内容)だが、IE11× では inline に pdf が表示されない(〇 のブラウザは表示される)ということですか? 試しに content-disposition を inline でなく attachment にしたらどうなりますか?
退会済みユーザー

退会済みユーザー

2017/06/29 02:22

リダイレクトされる理由は、たぶん、FriendlyUrlSettings によるもので、out.aspx というように拡張子付きで要求を受けた場合 out にリダイレクトされるような設定になっているからではないかと思われます。 VS2013 は使ってないので分かりませんが、自分が使っている VS2015 Community Update 3 では、テンプレートを使って Web Forms アプリのプロジェクトを自動生成すると、App_Start フォルダに RouteConfig.cs というファイルが生成され、Grobal.asax の Application_Start で FriendlyUrlSettings が設定されるようになります。確認してください。 そうであれば、Application_Start の RouteConfig.RegisterRoutes(RouteTable.Routes); をコメントアウトして試してみてください。 なお、試す前に、ブラウザのキャッシュはすべて削除した方がよさそうです。
退会済みユーザー

退会済みユーザー

2017/06/29 04:11

質問者さんの win10 ie11 の addon に adobe reader がないということはありませんか? 自分の環境で、質問者さんのコードとほぼ同じものを試してみましたが、pdf は問題なく表示されましたけど。
ubon

2017/06/29 04:14

回答ありがとうございます。SurferOnWwwさんの環境では表示されたのですね。 OKパターンではWin10 ie11で表示されますので、addonについては問題ないと考えております。
退会済みユーザー

退会済みユーザー

2017/06/29 06:05

質問者さんが試しているのは IE11 ではなくて、実は Edge だったというオチはありませんよね? 自分の環境でも、Edge の場合、GET は別ウィンドウが開いてそれに pdf が表示され、POST の場合は別ウィンドウは開くがそれは空白のまま、元のウィンドウには通知バーが表示されそこで[保存][名前を付けて保存][キャンセル]を選択するようになります。
ubon

2017/06/29 06:11

細かいご指摘ありがとうございます。念の為調べましたが、さすがにIE11でした。 ちなみにEdgeはどちらのパターンでもPDFは通知バーは出ずに期待通りの出力となりました。 SurferOnWwwさんが試していただいてWin10 IE11で表示されたとのことでしたので、当方でもaddonを無効にしたりadobe readerを再インストールしたり、セキュリティーソフトを止めたりと試しておりますがまだ改善できておりません。。。
退会済みユーザー

退会済みユーザー

2017/06/29 06:18

リダイレクトの原因は私が上に書いた通りでしたでしょうか? で、質問者さんは、今はリダイレクトされないような設定にして、すなわち、Application_Start の RouteConfig.RegisterRoutes(RouteTable.Routes); をコメントアウトして試しているのでしょうか? 自分はリダイレクトされない設定にして検証しています。
ubon

2017/06/29 06:28 編集

今はリダイレクトされないようにコメントアウトしてWin10 IE11環境にて試しております。 さきほど同じくWin10 IE11環境においてInPrivateブラウズモードでアクセスしたところ、OKパターンは問題なく表示され、ダメパターンでは、真っ白ではなく、グレーの背景になった直後、アラートが表示されることを確認しました。 タイトルは「Adobe PDF 文書」で警告の黄色アイコンとともに「アクセスが拒否されました。」と表示されました。OKをクリックした後は、またいつもの真っ白になってしまいます。 さらに真っ白になった状態でソースコードを表示させてみたところ下記のようになっておりました。 ''' <html><body leftmargin=0 topmargin=0 scroll=no> <embed width=100% height=100% fullscreen=yes src="http://localhost:51067/out.aspx?type=hist"></body></html> '''
退会済みユーザー

退会済みユーザー

2017/06/29 06:48

> 今はリダイレクトされないようにコメントアウトしてWin10 IE11環境にて試しております。 そうですか。そうすると自分が試している環境は質問者さんとほぼ同じのようですね。ということは質問者さん固有の環境の問題ということになるのでしょうか。 あまり参考にはならないかもしれませんが、自分の環境と検証に使ったコードその他の情報を回答欄に書いておきます。
ubon

2017/06/29 07:04

情報のご提供ありがとうございます。こちらはIE11をコントロールパネルより無効にし、再起動後、有効にして、adobe readerも入れ直す等試してみましたが、以前状況は変わらずです。
退会済みユーザー

退会済みユーザー

2017/07/06 02:29

「ベストアンサー」マークを付けてクローズされていますが、問題(Win10 IE11 に pdf が表示されない)は解決したのでしょうか? 解決したのであれば、どのような方法を取ったのか教えていただけると幸いです。
ubon

2017/07/08 07:03 編集

すみません。クローズしたつもりはありませんでしたので、ベストアンサーは外させていただきました。現在もまだ解決にはいたっておらず、調査した情報はアップデートしていきます。ちなみに2台ほど、Win10 Pro 64ビット IE11の環境があり、試しましたがSurferOnWwwさんと同様正しく動作しており、自分の環境のみ問題が起こっている状況です。自分と他の違いで 気付いたのはCreators Update です。
退会済みユーザー

退会済みユーザー

2017/07/08 10:23

了解しました。何か分かったら連絡いただけると幸いです。 ちなみに、問題のない自分の Win10 IE11 ですが Creators Update は適用されていません。
ubon

2017/08/02 11:55

Win10 64bit Creators Update適用済みの別の端末で試す機会がありましたので追記させていただきますが、IE11 KB4025252にて動作することを確認しました。
退会済みユーザー

退会済みユーザー

2017/08/02 12:30

情報をありがとうございました。KB4025252 の適用で解決(pdf が表示されるようになった)という理解でいいのでしょうか?
ubon

2017/08/03 01:43

あやふやな書き方で申し訳なかったです。 現状も未解決で、問題のある端末でも再度確認したらIE11 KB4025252でしたので、KBの適用は直接関係ないと思われます。端末個体の設定等に起因する可能性が高いので、引き続き何か分かり次第コメントいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問