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

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

ただいまの
回答率

90.51%

  • JavaScript

    20325questions

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

  • VB.NET

    1054questions

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

  • ASP.NET

    621questions

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

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,167

ubon

score 59

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ファイルは編集無し

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="base.aspx.vb" Inherits="WebApplication1.base" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta http-equiv="content-language" content="ja" />
    <meta http-equiv="x-ua-compatible" content="IE=10" />
    <meta http-equiv="x-ua-compatible" content="IE=EmulateIE10" />    
<title>output test</title>
    <script src="jquery.min.js" type="text/javascript"></script>

    <script type="text/javascript">
        $(function () {

            $('#btn_ok').click(function () {

                window.open('out.aspx?type=hist&rpt_hidP=' + 'dummy', '_blank');

            });

            $('#btn_dame').click(function () {

                window.open('', 'report');

                var form = $('<form/>', {
                    id: 'rpt_p',
                    action: 'out.aspx?type=hist',
                    target: 'report',
                    method: 'post'
                }).append($('<input/>').attr({
                    type: 'hidden',
                    id: 'rpt_hidP',
                    name: 'rpt_hidP',
                    value: 'dummy'
                })
                             );

                $('body').append(form);

                $('#rpt_p').submit();
                $('#rpt_p').remove();

                form = null;

            });

        });
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>

        <input type="button" id="btn_ok" value="OKパターン" />

        <input type="button" id="btn_dame" value="ダメパターン" />

    </div>
    </form>
</body>
</html>


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

Imports System
Imports System.IO

Public Class out
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Response.Cache.SetCacheability(HttpCacheability.NoCache)
        Response.Cache.SetNoStore()

        Dim bLength As Byte()

        'ファイルを開く
        Dim fs As New System.IO.FileStream(HttpContext.Current.Server.MapPath("pdf/sample.pdf"), System.IO.FileMode.Open, System.IO.FileAccess.Read)

        'ファイルを読み込むバイト型配列を作成する
        ReDim bLength(fs.Length)
        'ファイルの内容をすべて読み込む
        fs.Read(bLength, 0, Convert.ToInt32(bLength.Length))
        '閉じる
        fs.Close()

        Response.ClearHeaders()
        Response.ClearContent()
        Response.ContentType = "Application/pdf"

        ' ダイアログ表示
        Response.AddHeader("content-disposition", "inline; filename=" & System.Web.HttpUtility.UrlEncode("sample.pdf"))

        ' HTTP 出力ストリームに書き込み
        Response.BinaryWrite(bLength)
        Response.End()

    End Sub

End 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><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="/out?type=hist">here</a>.</h2>
</body></html>

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ubon

    2017/06/26 17:31

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

    キャンセル

  • SurferOnWww

    2017/06/26 17:40

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

    キャンセル

  • SurferOnWww

    2017/06/26 17:42

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

    キャンセル

回答 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 10: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 11:05 編集

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

    キャンセル

  • 2017/06/29 11: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 13:11

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

    キャンセル

  • 2017/06/29 13:14

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

    キャンセル

  • 2017/06/29 15:05

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

    キャンセル

  • 2017/06/29 15:11

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

    キャンセル

  • 2017/06/29 15:18

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

    キャンセル

  • 2017/06/29 15:27 編集

    今はリダイレクトされないようにコメントアウトして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&quot;&gt;&lt;/body&gt;&lt;/html&gt;
    '''

    キャンセル

  • 2017/06/29 15:48

    > 今はリダイレクトされないようにコメントアウトしてWin10 IE11環境にて試しております。

    そうですか。そうすると自分が試している環境は質問者さんとほぼ同じのようですね。ということは質問者さん固有の環境の問題ということになるのでしょうか。

    あまり参考にはならないかもしれませんが、自分の環境と検証に使ったコードその他の情報を回答欄に書いておきます。

    キャンセル

  • 2017/06/29 16:04

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

    キャンセル

  • 2017/07/06 11:29

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

    キャンセル

  • 2017/07/08 13:11 編集

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

    キャンセル

  • 2017/07/08 19:23

    了解しました。何か分かったら連絡いただけると幸いです。

    ちなみに、問題のない自分の Win10 IE11 ですが Creators Update は適用されていません。

    キャンセル

  • 2017/08/02 20:55

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

    キャンセル

  • 2017/08/02 21:30

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

    キャンセル

  • 2017/08/03 10:43

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

    キャンセル

同じタグがついた質問を見る

  • JavaScript

    20325questions

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

  • VB.NET

    1054questions

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

  • ASP.NET

    621questions

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