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


143

エラーが発生します:

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

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

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

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

回答:


162
Request.Redirect(url,false);

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


2
Request.Redirect(url、false)のようなものはありますか?
F11 2013

リクエストのリダイレクトプロパティはありません
karan 2017

あなたがよく要求として使用しているバージョン@karanは、「要求」のようになります
PrateekSaluja

125

次に示すように、2番目の引数をResponse falseにします。

Response.Redirect(url,false);

67

解決

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

症状

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が発生する


14

私が調査していたバグでは、Response.Redirect()があり、予期しない場所で実行されていました(読み取り:不適切な場所-メンバープロパティのゲッターメソッド内)。

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

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

デバッガーの「ステップスルー」がその場所に到達する前にリダイレクト呼び出しを実行しているように見えるため、これは苛立たしいものでした。


13

この問題の背後にある理由とエラーの解決策については、このリンクを確認してください:

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

マイクロソフトサポート記事:

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メソッドを使用します。


3

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


3

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

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();
}

5
このコードが何をするかについてのもう少しの説明がいいでしょう。
Meryovi 2013年


2

他の誰かが私が行った問題に遭遇した場合は、Response.End()非同期トリガーボタンを使用していました

<asp:AsyncPostBackTrigger ControlID="btn_login" />

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

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

ページでリダイレクトするだけだったので、これは実行可能な解決策でした。


2

更新パネルを使用していて、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();

1

これを使用して、常に私のために働きます。

Response.Redirect(Request.RawUrl, false);

ここで、Response.Redirect(Request.RawUrl)は単に現在のコンテキストのURLにリダイレクトしますが、2番目のパラメーター "false"はendResponseかどうかを示します。


1
Stackoverflowへようこそ。他の人が簡単に理解できるように、なぜそれがどのように機能して問題を解決するのか、あなたの答えを説明してください。
オクトバス

0

この問題は、mvcにかみそりのページがあり、いくつかの検証ルールを持つモデルがある場合に発生する可能性があります。フォームから投稿し、一部のフィールドで検証エラーを表示するのを忘れた場合、このメッセージが表示されることがあります。推測:これは、投稿先のメソッドが異なり、他のソースによって使用されているか、元のリクエストを処理するメソッドとは別の場所にある場合に発生する可能性があります。

そのため、異なるため、元のページに戻ってエラーを表示または処理することはできません。実行とモデルの状態が同じではないためです(そのようなもの)。

発見するのは少し難しいかもしれませんが、簡単に間違いを犯す可能性があります。受信メソッドが実際に投稿するすべての可能な方法を検証することを確認してください。

たとえば、サーバーサイドの検証で実際に検証で許可されている最大値よりも大きい文字列をフォームに書き込むことができない場合でも、受信メソッドにポストする他の方法やソースが存在する可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.