2013-10-02 2 views
0

Im новой для .net, Im используя следующий код для передачи из GridView, чтобы преуспеть:System.Threading.ThreadAbortException произошло в mscorlib.dll происходящей persitently

  protected void toexcelbutton_Click(object sender, EventArgs e) 
     { 
     Response.ClearContent(); 
    Response.Buffer = true; 
    Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", "attendancedatereport.xls")); 
    Response.ContentType = "application/ms-excel"; 
    StringWriter sw = new StringWriter(); 
    HtmlTextWriter htw = new HtmlTextWriter(sw); 
    GridView1.AllowPaging = false; 
    GridView1.AllowSorting = false; 
    GridView1.DataBind(); 
    HtmlForm htmfrm = new HtmlForm(); 
    GridView1.Parent.Controls.Add(htmfrm); 
    htmfrm.Attributes["runat"] = "server"; 
    htmfrm.Controls.Add(GridView1); 
    htmfrm.RenderControl(htw); 
    Response.Write(sw.ToString()); 

    HttpContext.Current.ApplicationInstance.CompleteRequest(); 
} 

Когда я запускаю этот код, я получаю Исключение:

В mscorlib.dll произошла первая случайная ошибка типа «System.Threading.ThreadAbortException».

Но, когда я запускаю тот же код на другой странице для другого GridView, она прекрасно работает., Я попробовал, добавив

EnableEventValidation="false" 

на страницу ASPX и

<pre lang="cs">public override void VerifyRenderingInServerForm(Control control) 
{ 
    /* Verifies that the control is rendered */ 
}</pre> 

к aspx.cs page,

Я попытался очистить временные файлы, все же я получаю ту же ошибку, более чем за 5 часов я пробовал, ничего не работает.

Затем я попытался выбрать Debug ->Исключение пункта меню и в появившемся диалоговом окне, проверил первый флажок «Common Language Runtime исключений,

я получаю эту ошибку:

Access to the path 'C:\Users\abcd\AppData\Local\Temp\Temporary ASP.NET Files\mark\3f229106\f785abea\App_Web_0h5ppn4m.dll' is denied.

ответ

5

Да, это будет происходить в связи с этим:

Response.End(); 

в:

To mimic the behavior of the End method in ASP, this method tries to raise a [ThreadAbortException] exception. If this attempt is successful, the calling thread will be aborted, which is detrimental to your site's performance. In that case, no code after the call to the End method is executed.

Так что ваш Response.Clear вызов не имеет смысла - и вы должны ожидать увидеть ThreadAbortException, которые вы можете игнорировать в этом случае.

Если вам нужно позвонить Response.Clearвообще, это должно быть до того, как вы напишете, но я подозреваю, что вы в порядке, чтобы просто удалить его полностью.

+0

@TimSchmelter: Хорошо - удалит этот бит, спасибо. –

+0

, код im, использующий i, был взят с другого сайта .. – user2740323

+0

@ user2740323: Это не делает его правильным ... вы всегда должны убедиться, что вы * понимаете * какой бы код вы ни использовали и подтверждаете, что он имеет смысл , –

0

Во-первых, я бы использовал excel-library, как EPPlus (GPL), который я могу рекомендовать.

Тогда это так просто, как создать настоящие файлы excel и записать его в Response, например.:

Dim pck = New ExcelPackage() 
Dim ws = pck.Workbook.Worksheets.Add("Worksheet-Name") 
ws.Cells("A1").LoadFromDataTable(dt, True, OfficeOpenXml.Table.TableStyles.Medium1) 
Response.Clear() 
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" 
Response.AddHeader("content-disposition", "attachment; filename=ExcelFileName.xlsx") 
Response.BinaryWrite(pck.GetAsByteArray()) 

Вот еще один пример: http://epplus.codeplex.com/wikipage?title=WebapplicationExample


передачи заднего хода Response.Clear + Response.End, Clear должен быть первый и последний End:

try { 
    Response.Clear(); 
    // ... 
} catch (Exception ex) { 
    //log error 
} 
// use HttpContext.Current.ApplicationInstance.CompleteRequest(); instead 
Response.End(); 

HttpResponse.End

Sends all currently buffered output to the client, stops execution of the page, and raises the EndRequest event.

Обратите внимание, что вы также должны использовать переопределение VerifyRenderingInServerForm, чтобы избежать исключения, если вы пытаетесь отобразить GridView.

public override void VerifyRenderingInServerForm(Control control) 
{ 
    /* Confirms that an HtmlForm control is rendered for the specified ASP.NET 
    server control at run time. */ 
} 

GridView must be placed inside a form tag with runat="server" even after the GridView is within a form tag


Edit:

Но вместо Response.End вы можете использовать HttpContext.Current.ApplicationInstance.CompleteRequest();:

http://scottstoecker.wordpress.com/2012/01/12/fixing-threadabortexception-when-using-response-end/

+0

Я попытался использовать: HttpContext.Current.ApplicationInstance.CompleteRequest(); теперь я получаю «Первое исключение исключения из типа« System.Web.HttpUnhandledException »произошло в System.Web.dll« – user2740323

+0

@ user2740323: Вы также переопределили 'VerifyRenderingInServerForm'? –

+0

да, у меня есть, я также добавил EnableEventValidation = "false" в директиву страницы @Tim Schmelter – user2740323

Смежные вопросы