0

そのため、私たちの Web サイトには、Excel スプレッドシートとしてダウンロードできる複数のレポートがあります。ハードドライブから空白のテンプレート ファイルを読み込み、それを MemoryStream にコピーし、DocumentFormat.OpenXml.Spreadsheet を使用してデータをテンプレートにプッシュすることでこれを実現します。 ; 次に、ヘッダーを設定し、ストリームを Response にコピーする関数に MemoryStream を渡します。

FF と Chrome で素晴らしい動作をしますが、IE9 (および 8、私の QA によると) はリモート サーバーへのログインを求める Windows セキュリティ ログイン ダイアログをランダムに表示します。ダイアログをキャンセルするか、[OK] をクリックして (資格情報が無視されているようです)、期待どおりに Excel ファイルを取得できます。(CharlesProxy を使用して) クエリを確認すると、CharlesProxy を再度無効にするまでログイン ダイアログが表示されないため、開発マシンとサーバーの間のトラフィックに違いがあるかどうかを確認できません。また、開発/テストサーバーからだけで、ローカルホストからデバッグを実行しても発生しません。

問題のコードは次のとおりです。これはコード ビハインドのサーバー側関数から呼び出されるため、RespondAsExcel は応答をクリアし、代わりに xlsx を挿入します。

            using (MemoryStream excelStream = new MemoryStream())
    {
        using (FileStream template = new FileStream(Server.MapPath(@"Reports\AlignedTemplateRII.xlsx"), FileMode.Open, FileAccess.Read))
        {
            Master.CopyStream(template, excelStream);
        }

    //Logic here to push data into the Memory stream using DocumentFormat.OpenXml.Spreadsheet;


        Master.RespondAsExcel(excelStream, pgmName);
    }


        public void RespondAsExcel(MemoryStream excelStream, string fileName)
{
    var contenttype = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    Response.Clear();
    Response.ContentType = contenttype;
    fileName = Utils.ReplaceWhiteSpaceWithUnderScores(fileName);
    Response.AddHeader("content-disposition", "inline;filename=" + fileName);
    Response.Cache.SetCacheability(HttpCacheability.NoCache);

    Response.BinaryWrite(excelStream.ToArray());
    //If that doesn't work, can try this way:
    //excelStream.WriteTo(Response.OutputStream);

    Response.End();
}

        public void CopyStream(Stream source, Stream destination)
{
    byte[] buffer = new byte[32768];
    int bytesRead;
    do
    {
        bytesRead = source.Read(buffer, 0, buffer.Length);
        destination.Write(buffer, 0, bytesRead);
    } while (bytesRead != 0);
}
4

3 に答える 3

0

いつでも却下できる「余分な認証ダイアログ」に関していくつかのアイデアが思い浮かびます...これがあなたの問題であるとは約束しませんが、それは確かにそれのいとこのようなにおいがします.

Office 2007 以降のドキュメントは、要求が行われたときに IE のセキュリティ ゾーン フィルターを受け入れない WebClient ライブラリを使用して HTTP ベースのリポジトリを開きます。ファイルが IE によって要求され、ホスト URL にドットが含まれている (FQDN を意味する) 場合、サイトが匿名で認証されている (資格情報を必要としない) 場合でも、キャンセルするか、単に 3 回クリックすることができる "資格情報" ダイアログが表示されます。そして捨てました。私は昨日この問題に対処していましたが、私が知る限り、ファイルが IE で配信されている場合、回避策はありません。IE がファイルを配信する方法には、ファイルが既にクライアントに配信されているにもかかわらず、Office アプリが開く前に要求を認証する必要があると信じ込ませる、いくつかの癖があります。

ダイアログの問題は、ドキュメントが要求サーバーと同じドメイン内のホスト サーバーから配信される場合に解決される場合があります (例: some-server.a.domain.com から my-machine.a.domain.com へ)。

2 番目のアイデアは、厳密に私自身の経験から生まれたものです。openoffice ベンダーのフォーマット タイプは、ドキュメント ストリームの状況で独自の奇妙なセットを導入することがあります。application/vnd.ms-excel のタイプを使用したところ、同じアプリケーションにマップされるように見えますが、問題はそれほど一般的ではないようです。

これからのことを考えるヒントになるかもしれません。結局のところ、今あなたが直面している状況に理想的な解決策はないと思います。私たちは同じ船に乗っており、社内のクライアントに、ダイアログが表示されたら「キャンセル」を押すだけで、必要なドキュメントを取得できるように伝えなければなりませんでした。

于 2012-04-21T22:42:42.657 に答える
0

RespondAsExcel() メソッドで、content-dispositon応答ヘッダーを からinlineに変更しますattachment。これにより、ブラウザはファイルを読み取り専用で開くようになります。KB899927を参照してください。

Response.AddHeader("content-disposition", "attachment;filename=" + fileName);
于 2014-08-08T17:21:05.433 に答える