0

以下のコードを使用して、asp.netにファイルをダウンロードしています

public void DownloadFile(String fileName, String msg)
{
    if (String.IsNullOrEmpty(fileName))
    {
        fileName = "Document.txt";
    }

    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.BufferOutput = true;
    HttpContext.Current.Response.ContentType = "application/octet-stream";
    HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
    using (MemoryStream ms = new MemoryStream())
    {
        using (StreamWriter sw = new StreamWriter(ms))
        {
            sw.Write(msg);
            sw.Flush();
            ms.Position = 0;
            using (Stream download = ms)
            {
                byte[] buffer = new Byte[ms.Length];
                if (HttpContext.Current.Response.IsClientConnected)
                {
                    int length = 0;
                    length = download.Read(buffer, 0, buffer.Length);
                    HttpContext.Current.Response.OutputStream.Write(buffer, 0, length);
                }
                HttpContext.Current.Response.Flush();
                HttpContext.Current.Response.End();
            }
        }
    }
}

「HttpContext.Current.Response.End();」で例外が発生しています。
HttpContext.Current.Response.End(); コードが最適化されているか、ネイティブ フレームがコール スタックの一番上にあるため、式を評価できません。

そのコードで何を変更する必要がありますか? 私が間違っているところ。

4

1 に答える 1

0

あなたを助けるリンクを見てください:

必要に応じて try-catch ステートメントを使用して例外をキャッチします

 try 
    {
    }
    catch (System.Threading.ThreadAbortException ex)
    {
    }
    For Response.End : Invoke  HttpContext.Current.ApplicationInstance.CompleteRequest    method instead of Response.End to bypass the code execution to the Application_EndRequest event
    For Response.Redirect : Use an overload, Response.Redirect(String url, bool endResponse) that passes false for endResponse parameter to suppress the internal call to Response.End

// code that follows Response.Redirect is executed
Response.Redirect ("mynextpage.aspx", false);
For Server.Transfer : Use Server.Execute method to bypass abort. When Server.Execute is used, execution of code happens on the new page, post which the control returns to the initial page, just after where it was called

制限/結論:

これは設計どおりです。この例外は Web アプリケーションのパフォーマンスに悪影響を与えるため、シナリオを正しく処理することが重要です。

于 2013-11-12T12:00:45.227 に答える