2012-04-21 4 views
0

私たちのウェブサイトでは、複数のレポートをExcelスプレッドシートとしてダウンロードできます。それをMemoryStreamにコピーし、DocumentFormat.OpenXml.Spreadsheetでテンプレートにデータをプッシュします。次に、ヘッダを設定し、ストリームをレスポンスにコピーする関数にMemoryStreamを渡します。IE9は、.xlsxとしてバイナリBLOBを送信するときにランダムにポップアップするWindowsセキュリティダイアログ

作品は、私はあなたのリモートサーバにログインするように求めるWindowsセキュリティのログインダイアログをランダムにポップアップするが、あなたはIE9(と8、私のQAが教えてくれた)をで公開しています。ダイアログをキャンセルするか、okを押して(資格情報が無視されるように見える)、Excelファイルを期待どおりに取得できます。 (CharlesProxyを使って)クエリを見ると、CharlesProxyを再び無効にするまでログインダイアログが表示されないので、私のdevマシンとサーバーの間のトラフィックに違いがあるかどうかはわかりません。また、Dev/Testサーバーからローカルホストからデバッグを実行しているときにも発生しません。

どのようなヘルプも便利です。問題のコードは次のとおりです。これは、コードの背後にあるサーバー側の関数から呼び出されます。そのため、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); 
} 
+0

コンテンツタイプを' application/octet-stream'に設定してみてください。 –

+0

これは動作上の変化はありません。残念ながら – Drogo

答えて

0

常に却下することができ、「余分な認証ダイアログが」...これを約束しないことについて、心に来るのアイデアのカップルはあなたの問題ですが、それは確かにそれの最初のいとこのようなにおいがします。

Office 2007以降のドキュメントでは、WebClientライブラリでHTTPベースのリポジトリが開かれていますが、要求が行われたときにIEのセキュリティゾーンフィルタは使用されません。ファイルがIEによって要求され、ホストURLにドット(FQDNを意味する)が含まれている場合、サイトが匿名で認証されていても(資格情報を必要としなくても)、「資格情報」ダイアログが表示され、廃棄される。私はちょうどこの昨日の問題を扱っていました、そして、私が言うことができるように、ファイルがIEで配信されるなら、回避策はありません。 IEがファイルをどのように配信するかについては、ファイルが既にクライアントに配信されているにもかかわらず、公開前に要求を認証する必要があると思わせるファイルをOfficeアプリがどのように提供するかについてのいくつかの特色があります。

ドキュメントがリクエストサーバーと同じドメインのホストサーバー、たとえばsome-server.a.domain.comからmy-machine.a.domain.comに配信されると、ダイアログの問題が解決される可能性があります。

第2のアイデアは、自分の経験から厳密に生まれたものです。つまり、オープンオフィスのベンダーのフォーマットタイプは、ドキュメントストリームの状況で独自の奇妙なセットを導入することがあります。私たちはapplication/vnd.ms-excelの一種を使用しましたが、同じアプリケーションにマッピングする必要があるようですが、問題はあまり一般的ではないようです。

おそらくそれはあなたに今後の考えを与えることができます。最終的には、現在直面している状況に理想的なソリューションはないと思います。私たちは同じ船に乗っていて、社内のクライアントに「Cancel」を押すだけでダイアログを表示させ、必要な文書を入手するようにしなければなりませんでした。

+0

私はこの問題を調査していましたが、ストリームを直接レスポンスに送信する方法を使用するのか、サーバーのハードドライブに実際にファイルを保存してから応答をそのファイルにリダイレクトするのかは関係ありません。両方の方法でこの問題が発生します。保存の代わりにクリックすると、IEが.xlsxを開こうとする方法のバグです。 – Drogo

0

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

Response.AddHeader("content-disposition", "attachment;filename=" + fileName); 
0

「Response.ContentTypeの=」application/vnd.ms-excel」に使用したとき、私は、私は単純に次のコードを追加しないと、Windowsのセキュリティポップアップウィンドウは、もはや登場するVBScriptと同様のものを持っていた: - レスポンス。 AddHeader "content-disposition"、 "attachment; filename = your_file_name_here。xls "

+1

コードセグメントをより読みやすくするために '{}'を使用してください。 – codeforester

関連する問題