रिस्पांस से कैसे बचें। और () "थ्रेड निरस्त किया जा रहा था" एक्सेल फ़ाइल डाउनलोड के दौरान अपवाद


96

मैंने अपने डेटासेट को एक्सेल में बदलने की कोशिश की और उस एक्सेल को डाउनलोड किया। मुझे मेरी आवश्यक एक्सेल फाइल मिल गई। लेकिन सिस्टम। थ्रेडिंग। थ्रेडअबोर्टएक्ससेप्शन हर एक्सेल डाउनलोड को उठाया गया था। इस समस्या को कैसे हल करें? .. कृपया मेरी मदद करें ...

मैं इस विधि को अपनी aspx स्क्रीन में कहता हूं। इस विधि द्वारा भी एक ही अपवाद को फेंक दिया गया है।

मुझे लगता है कि सार्वजनिक शून्य ExportDataSet (DataSet ds) फ़ंक्शन कई एस्पक्स स्क्रीन में हैं और मैं अपवादों के लिए त्रुटि लकड़हारा विधि बनाए रख रहा हूं, जो रनटाइम पर उठाई जाती हैं, उन अपवादों को एक .txt फ़ाइलों में लिखा जाता है। ताकि सभी aspx स्क्रीन की txt फ़ाइलों में एक ही अपवाद लॉग इन हो। मैं इस अपवाद को बचने के लिए विधि घोषित क्लास फ़ाइल से aspx में फेंकना चाहता हूं। बस मैं अपनी विधि घोषणा कक्षा फ़ाइल में ही इस अपवाद को संभालना चाहता हूं।

ASPX फ़ाइल विधि कॉल: excel.ExportDataSet (dsExcel);

विधि परिभाषा:

public void ExportDataSet(DataSet ds)
{

   try
   {
      string filename = "ExcelFile.xls";
      HttpResponse response = HttpContext.Current.Response;
      response.Clear();
      response.Charset = "";
      response.ContentType = "application/vnd.ms-excel";
      response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"");
      using (StringWriter sw = new StringWriter())
      {
         using (HtmlTextWriter htw = new HtmlTextWriter(sw))
         {
             GridView dg = new GridView();
             dg.DataSource = ds.Tables[0];
             dg.DataBind();
             dg.RenderControl(htw);
             // response.Write(style);
             response.Write(sw.ToString());                                                
             response.End();                    // Exception was Raised at here
         }
      }
   }
   catch (Exception ex)
   {
      string Err = ex.Message.ToString();
      EsHelper.EsADLogger("HOQCMgmt.aspx ibtnExcelAll_Click()", ex.Message.ToString());
   }
   finally
   {                
   }
}

2
का प्रयोग न करें Response.Endदेखने stackoverflow.com/a/3917180/2864740 (और अन्य उत्तर); ध्यान दें कि अपवाद "अपेक्षित होने के लिए" है क्योंकि यह है कि स्टैक निराधार है (इसलिए उस अपवाद को न पकड़ें)। यदि आप अभी भी [अन्य] अपवादों को पकड़ना चाहते हैं, तो उपयोग करें:.. catch (ThreadAbortException) { throw; /* propagate */ } catch (Exception ex) { .. }
user2864740

बस जिज्ञासा है कि आप किस
लकड़हारे

जवाबों:


194

मैंने ऑनलाइन शोध किया और देखा कि Response.End()हमेशा एक अपवाद फेंकता है।

इसे बदलें: HttpContext.Current.Response.End();

इसके साथ:

HttpContext.Current.Response.Flush(); // Sends all currently buffered output to the client.
HttpContext.Current.Response.SuppressContent = true;  // Gets or sets a value indicating whether to send HTTP content to the client.
HttpContext.Current.ApplicationInstance.CompleteRequest(); // Causes ASP.NET to bypass all events and filtering in the HTTP pipeline chain of execution and directly execute the EndRequest event.

2
वाह भगवन्। इसने मुझे WinDbg का उपयोग करके डिबग के घंटे बचाए। मेरे मामले में, मेरा w3wp.exe बस दुर्घटनाग्रस्त हो गया अगर बहुत सारे थ्रेडबर्स्ट हैं
Dio Phung

धन्यवाद। कोड का यह टुकड़ा वास्तव में मददगार है अगर आप asmx सर्विस कंस्ट्रक्टर को कुछ ऑथराइजेशन चेक जोड़ना चाहते हैं
vadim

इसने मेरे लिए काम किया। मैंने सुझाए गए कोड के साथ। और () को बदल दिया है और यह अब बिना किसी अपवाद के काम करता है। धन्यवाद, मेरा काम कोड अब है: Response.ContentType = "text / csv"; Response.AddHeader ( "सामग्री-विन्यास", String.Format ( "लगाव; फ़ाइल नाम = \" {0} \ "", Path.GetFileName (filepath))); Response.TransmitFile (filepath); //Response.End (); HttpContext.Current.Response.Flush (); HttpContext.Current.Response.SuppressContent = true; HttpContext.Current.ApplicationInstance.CompleteRequest ();
नूर लाबिदी

3
नहीं, मेरे लिए काम नहीं करता है। दरअसल जवाब देखिए। यदि Response.End()काम नहीं करता है, तो सुझाए गए उत्तर भी Response.End()अंतिम पंक्ति में क्यों हैं? इसके बजाय @Binny (नीचे) से जवाब मदद करता है!
user3454439

1
Docs.microsoft.com/en-us/dotnet/api/system.web.httpresponse.end Request.End पर प्रलेखन के अनुसार केवल पिछड़ी संगतता के लिए समर्थित है। प्रतिस्थापन के रूप में संपूर्ण उपयोग की सिफारिश की जाती है
रुडोल्फ ड्वोरसेक

11

इससे मुझे Thread was being abortedअपवाद को संभालने में मदद मिली ,

try
{
   //Write HTTP output
    HttpContext.Current.Response.Write(Data);
}  
catch (Exception exc) {}
finally {
   try 
    {
      //stop processing the script and return the current result
      HttpContext.Current.Response.End();
     } 
   catch (Exception ex) {} 
   finally {
        //Sends the response buffer
        HttpContext.Current.Response.Flush();
        // Prevents any other content from being sent to the browser
        HttpContext.Current.Response.SuppressContent = true;
        //Directs the thread to finish, bypassing additional processing
        HttpContext.Current.ApplicationInstance.CompleteRequest();
        //Suspends the current thread
        Thread.Sleep(1);
     }
   }

यदि आप इसके बजाय निम्नलिखित कोड का उपयोग करते हैं HttpContext.Current.Response.End(), तो आपको Server cannot append header after HTTP headers have been sentअपवाद मिलेगा ।

            HttpContext.Current.Response.Flush();
            HttpContext.Current.Response.SuppressContent = True;
            HttpContext.Current.ApplicationInstance.CompleteRequest();

आशा करता हूँ की ये काम करेगा


1
मेरे लिये कार्य करता है। ऊपर नहीं है। वास्तव में यह हास्यास्पद है कि Response.End()काम नहीं करता है, लेकिन सुझाव दिया विधि भी Response.End()अंतिम पंक्ति में है?
user3454439

1
कारण आप अपवाद को पकड़ रहे हैं और छिपा रहे हैं।
दान फ्रेडमैन

3
क्या एक भयानक समाधान है
रेजर

4

ऐसा ही प्रश्न लगता है:

जब ASP.NET System.Web.HttpResponse.End () कहा जाता है, तो वर्तमान थ्रेड को निरस्त कर दिया जाता है?

तो यह डिजाइन द्वारा है। आपको उस अपवाद के लिए एक पकड़ जोड़ने की जरूरत है और इनायत से इसे "अनदेखा" करें।


मुझे लगता है कि सार्वजनिक void ExportDataSet (DataSet ds) फ़ंक्शन कई Aspx स्क्रीन में कॉल करता है और मैं अपवादों के लिए त्रुटि लकड़हारा विधि बनाए रख रहा हूं, जो कि रनटाइम पर उठाई जाती हैं, उन अपवादों को एक .txt फ़ाइलों में लिखा जाता है। ताकि सभी aspx स्क्रीन की txt फ़ाइलों में एक ही अपवाद लॉग इन हो। मैं इस अपवाद को बचने के लिए पद्धति से वर्ग फ़ाइल से aspx घोषित करना चाहता हूं। बस मैं सिर्फ अपनी विधि घोषणा वर्ग फ़ाइल में इस अपवाद को संभालना चाहता हूं।
user3171957

आपके प्रश्न में उपयोगकर्ता की टिप्पणी के अनुसार, बस TheadAbortException -> catch (ThreadAbortException) {}
robnick

हाँ, विधि घोषणा वर्ग के साथ उस अपवाद को पकड़ें इसे स्व।
user3171957

4

Try / पकड़ो और ब्लॉक का उपयोग करने के बाहर Response.End () ले जाएँ।

यह एक अनुरोध के बाकी को बायपास करने के लिए एक अपवाद फेंकने के लिए लगता है, आप बस इसे पकड़ने के लिए नहीं थे।

bool endRequest = false;

try
{
    .. do stuff
    endRequest = true;
}
catch {}

if (endRequest)
    Resonse.End();

ऐसा क्यों नहीं है कि आखिरकार ब्लॉक में, इसलिए इसे हमेशा निष्पादित किया जाता है?
गोल्डबिशप

आप ऐसा कर सकते हैं, खासकर यदि आपके पास कोशिश ब्लॉक में रिटर्न स्टेटमेंट है। लेकिन अगर आप कोशिश करते हैं / पकड़ते हैं / अनदेखा करते हैं तो आपको आखिरकार जरूरत भी नहीं है। महत्वपूर्ण बात यह है कि आपको ThreadAbortException को पकड़ना नहीं चाहिए।
स्टीव

सच है, TAE एक सफल प्रतिक्रिया देने के लिए एक PITA है।
गोल्डबिशप

3

बस डाल दिया

Response.End();

कोशिश ब्लॉक के भीतर के बजाय अंत में ब्लॉक।

यह मेरे लिए काम किया है !!!

मेरे पास निम्नलिखित समस्याग्रस्त (अपवाद के साथ) कोड संरचना थी

...
Response.Clear();
...
...
try{
 if (something){
   Reponse.Write(...);
   Response.End();

   return;

 } 

 some_more_code...

 Reponse.Write(...);
 Response.End();

}
catch(Exception){
}
finally{}

और यह अपवाद फेंकता है। मुझे संदेह है कि अपवाद को फेंक दिया गया है जहां प्रतिक्रिया के बाद निष्पादित करने के लिए कोड / कार्य है। और (); । मेरे मामले में अतिरिक्त कोड केवल रिटर्न ही था।

जब मैंने केवल प्रतिक्रिया को स्थानांतरित किया। और (); अंत में ब्लॉक करने के लिए (और अपनी जगह पर वापसी छोड़ दिया - जो प्रयास ब्लॉक में कोड के बाकी को लंघन और अंत में ब्लॉक करने के लिए कूद (न केवल युक्त समारोह से बाहर निकलने के कारण)) अपवाद जगह लेने के लिए बंद हो गया।

निम्नलिखित कार्य ठीक है:

...
Response.Clear();
...
...
try{
 if (something){
   Reponse.Write(...);

   return;

 } 

 some_more_code...

 Reponse.Write(...);

}
catch(Exception){
}
finally{
    Response.End();
}

3

Response.End () पद्धति के अपवाद के लिए एक विशेष कैच ब्लॉक का उपयोग करें

{
    ...
    context.Response.End(); //always throws an exception

}
catch (ThreadAbortException e)
{
    //this is special for the Response.end exception
}
catch (Exception e)
{
     context.Response.ContentType = "text/plain";
     context.Response.Write(e.Message);
}

या सिर्फ रिस्पांस हटा दें। और () यदि आपका फ़ाइलहैंडल बन रहा है


2

मेरे लिए केवल काम करता है

HttpContext.Current.ApplicationInstance.CompleteRequest ()।

https://stackoverflow.com/a/21043051/1828356


1
Docs.microsoft.com/en-us/dotnet/api/system.web.httpresponse.end Request.End पर प्रलेखन के अनुसार केवल पिछड़ी संगतता के लिए समर्थित है। प्रतिस्थापन के रूप में संपूर्ण उपयोग की सिफारिश की जाती है
रुडोल्फ ड्वोरसेक

2

मैंने UpdatePanel से लिंकबटन हटा दिया और प्रतिक्रिया भी लिखी। और () सफलता !!!


1

प्रतिक्रिया के लिए त्रुटि। END (); ऐसा इसलिए है क्योंकि आप एक एस्प अपडेट पैनल या किसी भी नियंत्रण का उपयोग कर रहे हैं जो जावास्क्रिप्ट का उपयोग कर रहा है, जावास्क्रिप्ट या स्क्रिप्टमैन या स्क्रिप्टिंग के बिना एस्प या html से नियंत्रण मूल का उपयोग करने का प्रयास करें


1

यह मुद्दा नहीं है, लेकिन यह डिजाइन द्वारा है। मूल कारण Microsoft समर्थन पृष्ठ में वर्णित है।

Response.End विधि पृष्ठ के निष्पादन को समाप्त करती है और एप्लिकेशन के ईवेंट पाइपलाइन में Application_EndRequest इवेंट के निष्पादन को शिफ्ट करती है। प्रतिक्रिया का अनुसरण करने वाले कोड की पंक्ति। और निष्पादित नहीं की जाती है।

प्रदान किया गया समाधान है:

Response.End के लिए, प्रतिक्रिया के बजाय HttpContext.Current.ApplicationInstance.CompleteRequest विधि को कॉल करें। और Application_EndRequest घटना के लिए कोड निष्पादन को बायपास करें।

यहाँ लिंक है: https://support.microsoft.com/en-us/help/312629/prb-threadabortexception-occurs-if-you-use-response-end--response-redi



0

मैंने उपरोक्त सभी परिवर्तनों का उपयोग किया है लेकिन फिर भी मुझे अपने वेब एप्लिकेशन पर एक ही मुद्दा मिल रहा है।

तब मैंने अपने होस्टिंग प्रदान करने के लिए संपर्क किया और उनसे पूछा कि क्या कोई सॉफ्टवेयर या एंटीवायरस हमारी फ़ाइलों को HTTP के माध्यम से स्थानांतरित करने के लिए अवरुद्ध कर रहा है। या ISP / नेटवर्क फ़ाइल को स्थानांतरित करने की अनुमति नहीं दे रहा है।

उन्होंने सर्वर सेटिंग्स की जाँच की और मेरे सर्वर के लिए "डेटा सेंटर साझा फ़ायरवॉल" को बायपास किया और अब हमारा एप्लिकेशन फ़ाइल डाउनलोड करने में सक्षम है।

आशा है कि यह उत्तर किसी की मदद करेगा। यह मेरे लिए काम किया है


जबकि यह काम कर सकता है, यह एक ठोस समाधान के रूप में नहीं लगता है। क्या आप कह रहे हैं कि फ़ायरवॉल पूरी तरह से अक्षम है? यह एक बड़ा "नहीं" होगा। या यह आपके आवेदन के लिए अनुकूलित है? यह भी अजीब है कि कुछ डेटाटेकर फ़ायरवॉल ब्लॉक पर एक थ्रेडबोर्टएक्ससेप्शन देखें ... दूसरे शब्दों में, सवाल का जवाब नहीं?
माइकल


0

मैं इस समाधान की सलाह देता हूं:

  1. उपयोग न करें response.End();

  2. इस वैश्विक संस्करण की घोषणा करें: bool isFileDownLoad;

  3. बस आपके बाद (response.Write(sw.ToString());) set ==> isFileDownLoad = true;

  4. अपने रेंडर को ओवरराइड करें जैसे:

    /// AEG : Very important to handle the thread aborted exception
    
    override protected void Render(HtmlTextWriter w)
    {
         if (!isFileDownLoad) base.Render(w);
    } 

0

मैंने पाया कि निम्नलिखित ने बेहतर काम किया ...

   private void EndResponse()
    {
        try
        {
            Context.Response.End();
        }
        catch (System.Threading.ThreadAbortException err)
        {
            System.Threading.Thread.ResetAbort();
        }
        catch (Exception err)
        {
        }
    }

0

मेरे लिए यह एक बटन रजिस्टर करने में मदद करता है जो कोड के पीछे कोड को कॉलबैक नियंत्रण के रूप में बुलाता है।

protected void Page_Init(object sender, EventArgs e)
{
    ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(btnMyExport);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.