web-dev-qa-db-fra.com

Impossible d'évaluer une expression car le code est optimisé ou un cadre natif se trouve en haut de la pile d'appels

J'ai deux boutons avec des gestionnaires d'événements onclick qui traitent les informations de deux grid views sur la page. Un bouton pour chaque gv. Celles-ci sont superposées et imbriquées dans une structure de table html.

Les boutons permettent d’exporter la date grid dans un document Excel (voir code ci-dessous)

Le bouton du haut et grid lorsque click sur le bouton fonctionne bien, mais le bouton du bas jette un ThreadAbortException: Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack.

Naturellement, j'ai Google-d pour cela, mais certains des meilleurs résultats concernaient des appels Response.Redirect() plutôt que Response.End(). Un de ces messages sur Forums.asp.net a la même erreur lors du même appel de méthode, mais la solution consistait à changer le code Response.Redirect() avec une page d'erreur en paramètre - là encore, ce qui n'est pas le cas.

Une autre recherche sur la page Microsoft Suport suggère une solution où HttpContext.Current.ApplicationInstance.CompleteRequest() remplace Response.End(). J'ai essayé ceci, l'erreur disparaît, de même que la fenêtre de téléchargement Excel.

Donc je ne sais pas où aller d'ici. Ce qui est étrange, c'est que le même code (moins gridview id) fonctionne pour l'un mais pour l'autre. Voici le code pour votre avis et j'ai marqué l'endroit où l'erreur est renvoyée. Je pensais que je pourrais peut-être créer un nouveau fil - cela atténuerait-il le problème? Je n'ai jamais fait d'application multi-threaded mais je suis partant pour un défi. 

<table>
  <tr>
   <td align="left">
     <asp:Button ID="btnExport" runat="server" OnClick="btnExport_Click"
          Text="Export" Visible="false" />
   </td>
  </tr>
  <tr>
   <td>                    
     <asp:Panel runat="server" ID="pnl1" Visible="false">
      <asp:GridView ID="gvCountTotalsCat" runat="server" 
          AutoGenerateColumns="false"
          CellPadding="3" PageSize="25" BackColor="White" BorderColor="MidnightBlue"
          BorderStyle="Groove" BorderWidth="1px" CssClass="TextCompact" 
          GridLines="Vertical"
          OnRowDataBound="gridView_OnRowDataBound"
          EmptyDataText="Your request has returned zero records">
          <Columns>
           <asp:TemplateField>
            <HeaderTemplate>
             <asp:Label runat="server" ID="lblHeader" Text="Cat" />
            </HeaderTemplate>
           <ItemTemplate>
            <asp:Literal ID="litWuc" runat="server" />
           </ItemTemplate>
           </asp:TemplateField>
            <asp:BoundField DataField="Cat Entries" HeaderText="Cat Entries" />
           <asp:TemplateField>
           <HeaderTemplate>
            <asp:Label runat="server" ID="lblHeader" />
           </HeaderTemplate>
           <ItemTemplate>
            <asp:Literal ID="litSum" runat="server" />
           </ItemTemplate>
          </asp:TemplateField>
         </Columns>                                              
        </asp:GridView>
       </asp:Panel>
   </td>
  </tr>
  <tr>
   <td align="left">
    <asp:Button ID="btnExport1" runat="server" OnClick="btnExport_Click1" 
         Text="Export" Visible="false" />
   </td>
  </tr>
  <tr>
   <td>                         
    <asp:Panel runat="server" ID="pnl2" Visible="false">
     <asp:GridView ID="gvCountTotalsCat1" runat="server" 
          AutoGenerateColumns="false"
          AllowPaging="false" CellPadding="3" PageSize="25" BackColor="White"
          BorderColor="MidnightBlue" BorderStyle="Groove" BorderWidth="1px" 
          CssClass="TextCompact" GridLines="Vertical" 
          OnRowDataBound="gridView_OnRowDataBound"
          EmptyDataText="Your request has returned zero records">
          <Columns>
            <asp:TemplateField>
             <HeaderTemplate>
              <asp:Label runat="server" ID="lblHeaderWuc" Text="Wuc" />
             </HeaderTemplate>
            <ItemTemplate>
            <asp:Literal ID="litWuc" runat="server" />
            </ItemTemplate>
           </asp:TemplateField>
           <asp:BoundField DataField="Wuc Entries" HeaderText="Wuc Entries" />
           <asp:TemplateField>
            <HeaderTemplate>
              <asp:Label runat="server" ID="lblHeader" />
            </HeaderTemplate>
            <ItemTemplate>
              <asp:Literal ID="litSum" runat="server" />
            </ItemTemplate>
           </asp:TemplateField>
          </Columns>     
         </asp:GridView>
        </asp:Panel>
       </td>
      </tr>
     </table>



public void btnExport_Click(object sender, System.EventArgs e)
{
    string attachment = string.Empty;
    StringWriter sw = new StringWriter();
    HtmlTextWriter htw = new HtmlTextWriter(sw);

    // Create a form to contain the grid
    HtmlForm frm = new HtmlForm();
    frm.Attributes["runat"] = "server";

    attachment = "attachment; filename=gvCountTotalsCat_" + _selectedSite + ".xls";
    gvCountTotalsCat.Parent.Controls.Add(frm);
    frm.Controls.Add(gvCountTotalsCat);

    Response.ClearContent();
    Response.AddHeader("content-disposition", attachment);
    Response.ContentType = "application/ms-Excel";

    frm.RenderControl(htw);

    Response.Write(sw.ToString());

    Response.End();
}



public void btnExport_Click1(object sender, System.EventArgs e)
{
    string attachment = string.Empty;
    StringWriter sw = new StringWriter();
    HtmlTextWriter htw = new HtmlTextWriter(sw);
    Response.Clear();
    Response.ClearHeaders();

    // Create a form to contain the grid
    HtmlForm frm = new HtmlForm();
    frm.Attributes["runat"] = "server";

    attachment = "attachment; filename=gvCountTotalsCat1_" + _selectedSite + ".xls";
    gvCountTotalsCat1.Parent.Controls.Add(frm);
    frm.Controls.Add(gvCountTotalsCat1);

    Response.ClearContent();
    Response.AddHeader("content-disposition", attachment);
    Response.ContentType = "application/ms-Excel";

    frm.RenderControl(htw);

    Response.Write(sw.ToString());

    try
    {
 >> Error thrown here >>     Response.End();

    }
    catch (System.Threading.ThreadAbortException lException)
    {
        lException;
    }
}
6
Risho

Il est apparu que j'avais à la fois des grilles et des boutons dans un Update Panel et que seul le bouton du haut était défini en tant que PostBackTrigger. Après avoir ajouté le second <asp:PostBackTrigger ControlID="btnExport1" /> et qui résolvent le problème.

8
Risho

Il existe un moyen pratique de traiter "Impossible d’évaluer une expression car le code est optimisé ou qu’une trame native se trouve au-dessus de la pile d’appels". problèmes. Vous devez écrire dans la fenêtre de sortie.

Ajouter en utilisant System.Diagnostics;

Ajouter un Try/Catch pour la ligne qui est en erreur

Dans la capture ajouter ces lignes

try
{ ..}
 catch(Exception ex)
{
    Debug.WriteLine(ex.Message);
    Debug.WriteLine(ex.StackTrace);
    Debug.WriteLine(ex.InnerException.ToString());
}

Il suffit de déboguer et de vérifier la fenêtre de sortie

J'espère que ça aide.

4
Santhosh

Peut être résolu en utilisant un ASPxGridViewExporter sans obtenir un ThreadAbortException.

Essayez l'extrait de code suivant:

try
{
    using (MemoryStream stream = new MemoryStream())
    {
        // Write the content of the xlsx to the stream
        gridViewExporter.WriteXlsx(stream, new XlsxExportOptions(TextExportMode.Text, false, false));

        if (Response == null)
        {
            return;
        }

        // Write the byte content to the output
        Response.Clear();
        Response.AppendHeader("Content-Disposition", StringMngr.SafeFormat("attachment; filename=\"{0}.xlsx\"", "xlsxFileName"));
        Response.ContentType = "Text/xlsx";
        Response.ContentEncoding = System.Text.Encoding.Unicode;

        if (stream.Length > 0)
        {
            Response.BinaryWrite(stream.ToArray());
        }

        Response.Flush();
        Response.SuppressContent = true;
    }
}
catch (Exception ex)
{
    log.Error("An error occured while downloading in xlsx format.", ex);
}

Il télécharge le fichier Excel sans obtenir une ThreadAbortException avec le message de:

Impossible d'évaluer une expression car le code est optimisé ou un cadre natif se trouve en haut de la pile d'appels.

et sans obtenir le message d'erreur suivant lors de l'ouverture du fichier Excel:

Excel a trouvé du contenu illisible dans myFilename.xlsx. Voulez-vous récupérer le contenu de ce classeur? Si vous faites confiance à la source de ce livre, cliquez sur Oui.

J'espère que ça aide! :)

0
ChocapicSz