Não é possível avaliar a expressão porque o código está otimizado ou um quadro nativo está no topo da pilha de chamadas

143

Estou recebendo o erro:

Não foi possível avaliar a expressão porque o código está otimizado ou um quadro nativo está no topo da pilha de chamadas.

Eu redirecionei para uma nova página no evento itemcommand do repetidor. O erro ocorre na linha:

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

Alguém pode me ajudar, por favor? Há algo errado aí? O _COMPlusExceptionCodeé - 532459699.

Radhi
fonte

Respostas:

162
Request.Redirect(url,false);

false indica se a execução da página atual deve terminar.

PrateekSaluja
fonte
2
Existe algo como Request.Redirect (url, false)?
F11
não há nenhuma propriedade de redirecionamento de pedido
karan
@karan qual versão você está usando como pedido também será assim "Request"
PrateekSaluja
125

Faça o segundo argumento Response falso, como mostrado abaixo.

Response.Redirect(url,false);
Radhi
fonte
67

Resolução

Para contornar esse problema, use um dos seguintes métodos:

  • Para Response.End , chame o método HttpContext.Current.ApplicationInstance.CompleteRequest () em vez de Response.End para ignorar a execução do código para o evento Application_EndRequest .

  • Para Response.Redirect , use uma sobrecarga, Response.Redirect (URL da string, bool endResponse) que passa false para o parâmetro endResponse para suprimir a chamada interna para Response.End . Por exemplo: Response.Redirect ("nextpage.aspx", false);Se você usar esta solução alternativa, o código que segue Response.Redirect será executado.

  • Para Server.Transfer , use o método Server.Execute .

Sintomas

Se você usar o método Response.End, Response.Redirect ou Server.Transfer, ocorrerá uma exceção ThreadAbortException. Você pode usar uma instrução try-catch para capturar essa exceção.

Causa

O método Response.End finaliza a execução da página e muda a execução para o evento Application_EndRequest no pipeline de eventos do aplicativo. A linha de código que segue Response.End não é executada.

Esse problema ocorre nos métodos Response.Redirect e Server.Transfer porque os dois métodos chamam Response.End internamente.

Status

Esse comportamento é por design.

Propriedades

ID do artigo 312629 - Última revisão: 30 de agosto de 2012 - Revisão: 4,0

Aplica-se a

  • 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

Palavras-chave: kbexcepthandling kbprb KB312629

Origem: PRB: ThreadAbortException ocorre se você usar Response.End, Response.Redirect ou Server.Transfer

Michel Ayres
fonte
14

Em um bug que eu estava investigando, havia um Response.Redirect () e estava sendo executado em um local inesperado ( leia-se: local inadequado - dentro de um método getter de propriedade do membro ).

Se você estiver depurando um problema e tiver a exceção " Não é possível avaliar a expressão ... ":

  1. Execute uma pesquisa Response.Redirect()e torne o segundo parâmetro endResponse = false ou
  2. Desative temporariamente a chamada de redirecionamento .

Isso foi frustrante, pois parecia executar a chamada de redirecionamento antes que a "etapa" no depurador chegasse àquele local.

Nick Josevski
fonte
13

Verifique este link para saber o motivo desse problema e a solução do erro:

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

Artigo de suporte da Microsoft:

PRB: ThreadAbortException ocorre se você usar Response.End, Response.Redirect ou Server.Transfer Imprimir Imprimir Email Email

Para contornar esse problema, use um dos seguintes métodos: Para Response.End, chame o método HttpContext.Current.ApplicationInstance.CompleteRequest em vez de Response.End para ignorar a execução do código para o evento Application_EndRequest.

Para Response.Redirect, use uma sobrecarga, Response.Redirect (URL da string, bool endResponse) que passa false para o parâmetro endResponse para suprimir a chamada interna para Response.End.

Por exemplo: Response.Redirect ("nextpage.aspx", false);

Se você usar essa solução alternativa, o código a seguir Response.Redirect será executado. Para Server.Transfer, use o método Server.Execute.

Mandeep Janjua
fonte
3

Eu também tive esse mesmo problema e foi complicado. Para mim, foi porque estou usando a biblioteca javascript Ext.Js. Se você estiver executando um response.redirect no código do servidor acessado em uma chamada Ajax , há problemas. O Ext.js tem uma solução alternativa com o método Ext.Redirect.

Scott
fonte
3

use este código resolva o problema:

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();
}
swathi
fonte
5
Um pouco mais de explicação sobre o que esse código faz seria bom.
Meryovi
3

Você também pode usar Server.Execute

sambit.albus
fonte
2

Apenas envolva alguém que se deparou com os problemas que eu fiz. Eu estava usando o Response.End () um botão de gatilho assíncrono

<asp:AsyncPostBackTrigger ControlID="btn_login" />

em um painel de atualização. Eu mudei para o correio normal de volta, não o melhor, mas funcionou.

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

Como eu estava redirecionando apenas na página, essa era uma solução viável.

vikingben
fonte
2

Se você estiver usando o Painel de Atualização e o botão Link para fazer o download do Excel, está dentro do painel, adicione o gatilho de postagem

<asp:PostBackTrigger ControlID="lnkTemplate" /> 

e no código por trás do evento dentro do clique

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();
Mudassir Hasan
fonte
1

Use isso, funciona para mim sempre.

Response.Redirect(Request.RawUrl, false);

Aqui, Response.Redirect (Request.RawUrl) simplesmente redireciona para o URL do contexto atual, enquanto o segundo parâmetro "false" indica endResponse ou não.

Chidi-Nwaneto
fonte
1
Bem-vindo ao Stackoverflow. Por favor, explique sua resposta, por que funciona, como resolve o problema, para que outras pessoas possam entender facilmente.
Octobus 6/12/19
0

Esse problema pode ser o resultado quando você tem uma página de barbear no mvc com um modelo que possui algumas regras de validação. Quando você publica de um formulário e se esquece de exibir erros de validação em algum campo, essa mensagem pode aparecer. Especulação: pode ser se o método para o qual você está postando for diferente e usado por outras fontes ou residir em um local diferente do método que atende à solicitação original.

Portanto, por ser diferente, ele não pode retornar à página original para exibir ou manipular os erros, porque o estado de execução e modelo não é o mesmo (algo assim).

Pode ser um pouco difícil de descobrir, mas é um erro fácil de fazer. Verifique se o método de recebimento realmente valida todas as maneiras possíveis de postar nele.

por exemplo, mesmo se você tiver uma validação no servidor que realmente impossibilita escrever no formulário uma sequência maior que o máximo permitido pela validação, pode haver outras maneiras e fontes que são postadas no método de recebimento.

Johan Herstad
fonte