web-dev-qa-db-ja.com

コードが最適化されているか、ネイティブフレームが呼び出しスタックの上にあるため、式を評価できません

エラーが発生しています:

コードが最適化されているか、ネイティブフレームが呼び出しスタックの上にあるため、式を評価できません。

リピーターのitemcommandイベントで新しいページにリダイレクトしました。次の行でエラーが発生します。

string url = "~/Galleries/AlbumImageList.aspx?UId=" + this.UserId.ToString() + "&AlbumId=" + e.CommandArgument.ToString();
Response.Redirect(url);

誰か助けてくれますか?何か問題はありますか? _COMPlusExceptionCodeは-532459699です。

141
Radhi

以下に示すように、Responseの2番目の引数を作成しますfalse

Response.Redirect(url,false);
121
Radhi
Request.Redirect(url,false);

falseは、現在のページの実行を終了するかどうかを示します。

159
PrateekSaluja

解決

この問題を回避するには、次のいずれかの方法を使用します。

  • Response.End の場合、_の代わりに HttpContext.Current.ApplicationInstance.CompleteRequest() メソッドを呼び出しますResponse.Endは、Application_EndRequestイベントへのコード実行をバイパスします。

  • Response.Redirect には、falseを渡すオーバーロードResponse.Redirect(String url、bool endResponse)を使用しますendResponseパラメーターは、Response.Endへの内部呼び出しを抑制します。例:Response.Redirect ("nextpage.aspx", false);この回避策を使用すると、Response.Redirectに続くコードが実行されます。

  • Server.Transfer の場合は、代わりに Server.Execute メソッドを使用します。

症状

Response.End、Response.Redirect、またはServer.Transferメソッドを使用すると、ThreadAbortException例外が発生します。 try-catchステートメントを使用して、この例外をキャッチできます。

原因

Response.Endメソッドは、ページの実行を終了し、実行をアプリケーションのイベントパイプラインのApplication_EndRequestイベントにシフトします。 Response.Endに続くコード行は実行されません。

この問題は、Response.RedirectメソッドとServer.Transferメソッドで発生します。両方のメソッドが内部でResponse.Endを呼び出すためです。

状態

この動作は仕様です。

物性

記事ID:312629-最終レビュー:2012年8月30日-改訂:4.0

に適用されます

  • Microsoft ASP.NET 4.5
  • Microsoft ASP.NET 4
  • Microsoft ASP.NET 3.5
  • Microsoft ASP.NET 2.0
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0

キーワード: kbexcepthandling kbprb KB312629

ソース:PRB:Response.End、Response.Redirect、またはServer.Transfer を使用するとThreadAbortExceptionが発生する

66
Michel Ayres

バグで、Response.Redirect()があり、nexpected locationread:不適切な場所-メンバープロパティゲッターメソッド内で実行されていたことを調査しました)。

問題をデバッグしていて、「式を評価できません...」例外が発生した場合:

  1. Response.Redirect()の検索を実行し、2番目のパラメーターendResponse= falseを作成するか、
  2. リダイレクト呼び出しを一時的に無効にします

これは、デバッガーの「ステップスルー」がその場所に到達する前にRedirect呼び出しを実行するように見えるため、イライラしていました。

14
Nick Josevski

この問題の原因とエラーの解決策については、次のリンクを確認してください。

http://support.Microsoft.com/kb/312629/EN-US/

Microsoftサポート記事:

PRB:Response.End、Response.Redirect、またはServer.Transferを使用するとThreadAbortExceptionが発生するPrint Print Email Email

この問題を回避するには、次のいずれかの方法を使用します。Response.Endの場合、Response.EndではなくHttpContext.Current.ApplicationInstance.CompleteRequestメソッドを呼び出して、Application_EndRequestイベントへのコード実行をバイパスします。

Response.Redirectの場合、endResponseパラメーターにfalseを渡すオーバーロードResponse.Redirect(String url、bool endResponse)を使用して、Response.Endへの内部呼び出しを抑制します。

例:Response.Redirect( "nextpage.aspx"、false);

この回避策を使用すると、Response.Redirectに続くコードが実行されます。 Server.Transferの場合は、代わりにServer.Executeメソッドを使用します。

13
Mandeep Janjua

このコードを使用して問題を解決します。

string path = AppDomain.CurrentDomain.BaseDirectory.ToString() + "Uploadfile\\" + fileName;
System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read);
byte[] bt = new byte[fs.Length];
fs.Read(bt, 0, (int)fs.Length);
fs.Close();
Response.ContentType = "application/x-unknown/octet-stream";
Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + fileName;+ "\"");
try
{
    if (bt != null)
    {
        System.IO.MemoryStream stream1 = new System.IO.MemoryStream(bt, true);
        stream1.Write(bt, 0, bt.Length);
        Response.BinaryWrite(bt);
        //Response.OutputStream.Write(bt, 0, (int)stream1.Length);
        Response.Flush();
        // Response.End();
    }
}
catch (Exception ex)
{
    Response.Write(ex.Message);
    throw ex;
}
finally
{
    Response.End();
}
3
swathi

私もこれと同じ問題を抱えていましたが、トリッキーでした。私にとっては、Ext.Js javascriptライブラリを使用しているからです。 Ajax呼び出しでにアクセスしたサーバー側コードでresponse.redirectを実行している場合、問題があります。 Ext.jsには、Ext.Redirectメソッドによる回避策があります。

3
scott

Server.Execute も使用できます

3
sambit.albus

Response.End()非同期トリガーボタンを使用していた問題に遭遇した他の誰かをちょうど包む

<asp:AsyncPostBackTrigger ControlID="btn_login" />

更新パネルで。私は通常のポストバックに切り替えましたが、最高ではありませんでしたが、うまくいきました。

<asp:PostBackTrigger ControlID="btn_login" />. 

ページ上でリダイレクトしているだけなので、これは実行可能なソリューションでした。

2
vikingben

更新パネルを使用していて、Excelをダウンロードするリンクボタンがパネル内にある場合、ポストバックトリガーを追加します

<asp:PostBackTrigger ControlID="lnkTemplate" /> 

コード内のクリックイベント内

string ServerPath = System.Configuration.ConfigurationManager.AppSettings["FilePath"] + "Template.xlsx";
System.IO.FileInfo file = new System.IO.FileInfo(Server.MapPath(ServerPath));

HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
HttpContext.Current.Response.AddHeader("Content-Length", file.Length.ToString());
            HttpContext.Current.Response.ContentType = "application/octet-stream";
 HttpContext.Current.Response.TransmitFile(file.FullName);
 HttpContext.Current.Response.Flush();
 HttpContext.Current.ApplicationInstance.CompleteRequest();
2
Mudassir Hasan