2011-08-15 1 views
3

私は、暗号化されたPDFファイルパスを取得し、解読し、結果のPDFをブラウザに配信する少しのアクションを構築しています。ファイルをブラウザに一貫して配信するasp.net mvcアクションを取得するにはどうすればよいですか?

私のコードはChromeとFirefoxでは100%の時間で動作しますが、IE9では50%しか動作しません。

IE9のリンクをたどると、Adobe Readerプラグインがブラウザウィンドウに開きますが、リフレッシュするまでファイルが表示されないようです。ここで

は私のコードです:

[CheckSubscriber] 
    public ActionResult file(string path) 
    { 
     string mappedPath = Server.MapPath(
           EncryptDecrypt.Decrypt(path, 
           EncString)); 

     return base.File(mappedPath, "application/pdf"); 

    } 

は、どのように私は、これはIE9で一貫して動作することになるだろうか?

私はここで大声で考えていますが、誤ったMIMEタイプを使用している可能性がありますか?

+0

CheckSubscriber属性は何をしていますか?それはまったく応答を混乱させるのですか(リダイレクトなど)? –

+0

'[CheckSubscriber]'は、アクションの前に実行されます。アクションの実行を許可する前に、ユーザーがアクティブなサブスクライバーであることを確認します。機能性はテストされており、アクションはその属性の有無にかかわらず同じように機能します。 – quakkels

答えて

4

明示的

Content-Disposition: inline; filename="foo.pdf" 

コンテンツ-処分を設定する必要があり、サーバからの応答を返す際に重要なレスポンスヘッダーです。これがMIMEタイプとともに指定されている場合、すべてのブラウザーは100%時間のファイルを正しく検出します。

Fiddlerを使用して、レスポンスヘッダーが正しい順序であることを確認できます。

編集

あなたはこれを行うには、あなたの行動のための「のActionResult」戻り値の型を使用することはできません。

"FilePathResult"または "FileStreamResult"を使用する必要があります。どちらもSystem.Web.MVC名前空間にあります。

Custom Action Return Typeを作成して、この操作に使用することもできます。 私が提供した記事は、これを行う方法について、コードとともに段階的に示しています。ここで

+0

Content-Dispositionのパラメータが表示されません。 'return base.File(.....)'を使って、どうすれば設定できますか? – quakkels

+1

ファイル結果にオーバーロードがあり、ファイル名を第3パラメータとしてダウンロードします。これは、あなたのためのコンテンツ処理ヘッダを設定します。 – Malevolence

+0

@quakkels:私はこれをやり遂げるときにあなたが持っているオプションを含める答えを編集しました。希望があれば願っています。乾杯! –

0

私はFiddlerを使用して、ブラウザが送受信するリクエスト/レスポンスの違いを確認し、そこから見つけられるかどうかを確認します。

+0

フィドラーとは何ですか? – quakkels

+0

[Fiddler](http://www.fiddler2.com/fiddler2/)は、Webデバッグツールです。これにより、Webページ内外のすべてのリクエストを監視できます。特にAJAXを使用している場合は、MVCフレームワークで作業する際に必要です。 –

0

は、私は(PDFファイルが同じである必要があります)Excelファイルを返す方法は次のとおりです。

public FileResult DownloadErrors(string filename) 
    { 
     var file = System.IO.File.ReadAllText(filename); 

     return File(new System.Text.UTF8Encoding().GetBytes(file), "application/ms-excel", "Errors.csv"); 
    } 

はFileResultの代わりのActionResultを使用してください。

関連する問題