2016-12-29 11 views
0

フォーム私は私のMVC C#アプリケーションに次のコードを持っている:リターンファイル相当

 return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "PSL.xlsx"); 

ストリームからPSLファイルを返します。

Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack.} 
+0

これはわかりました。このエラーはどこにありますか?正確にどの行ですか? – HaukurHaf

+0

実行直後。 voidを返すメソッドにコードがあります。これらの2つの同一のコード(MVCとWebフォームのコードは同じですか?) –

+0

全く同じコードではありませんが、結果は同じでなければなりません。ヘッダーをいくつか設定し、バイナリデータをブラウザに出力します。このエラーメッセージはわかりません。私はどの表現が評価されているのか分からない。 – HaukurHaf

答えて

0

エラー:

  Response.Clear(); 
      Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
      Response.AddHeader("Content-Disposition", "attachment; filename=PSL.xlsx"); 
      Response.BinaryWrite(stream.ToArray()); 
      // myMemoryStream.WriteTo(Response.OutputStream); //works too 
      Response.Flush(); 
      Response.Close(); 
      Response.End(); 

が、これは私が次のエラーメッセージを取得していますよう正しいアプローチであるかを知りたいと思った:私は後ろの私のWebフォームのコードで同じことをやろうとしていますResponse.End();を呼び出したときにスローされるThreadAbortExceptionによって引き起こされます。このquestionをチェックしてください。

Response.End();コールがあることに基づいて、あなたが含むコードがASPXページのイベントで実行されていることを前提としています。正しい?

もしそうなら、ファイルをロードしてASPXページからGeneric handlerにクライアントに返すコードを移動することをお勧めします。ジェネリックハンドラは、ファイル拡張子がASHXです。それは非常に簡単です - それはあなたが実装する必要があるメソッドとプロパティを1つだけ持っています。主なものはProcessRequestメソッドです。ハンドラからのサンプルがServeFile.ashxと呼ばれる:

public class ServeFile : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     byte[] fileBytes = File.ReadAllBytes("c:\\path\\to\\folder\\with\\files\\" + context.Request.QueryString["fileName"]); 
     context.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
     context.Response.AddHeader("Content-Disposition", "attachment; filename=PSL.xlsx"); 
     context.Response.BinaryWrite(fileBytes); 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

ハンドラを作成した後、あなたはその後、ハンドラが正しいをロードして提供するために使用するQueryStringでの適切な識別子とハンドラへのリンクを表示するために、あなたのaspxページを変更することができますファイル。サンプルでは、​​ファイルはファイルシステムから読み込まれますが、もちろんdbからロードすることも、他の方法で取得することもできます。