কীভাবে প্রতিক্রিয়া এড়ানো যায়। এবং () "থ্রেডটি বাতিল করা হয়েছিল" এক্সেল ফাইল ডাউনলোডের সময় ব্যতিক্রম


97

আমি আমার ডেটাসেটকে এক্সেলে রূপান্তর করতে এবং সেই এক্সেলটি ডাউনলোড করার চেষ্টা করেছি I এই সমস্যাটি কীভাবে সমাধান করবেন? .. আমাকে সাহায্য করুন ...

আমি আমার এসপেক্স স্ক্রিনে এই পদ্ধতিটি কল করি same এই পদ্ধতিটি দ্বারা একই ব্যতিক্রমও ছুঁড়েছে।

আমি বহু এসপেক্স স্ক্রিনগুলিতে এই সার্বজনীন অকার্যকর এক্সপোর্টডেটা সেট (ডেটাসেট ডিএস) ফাংশন বলি এবং আমি ব্যতিক্রমগুলির জন্য ত্রুটি লগার পদ্ধতি বজায় রাখছি যা রানটাইমের সময় উত্থাপিত হয় সেই ব্যতিক্রমগুলি একটি .txt ফাইলগুলিতে লেখার জন্য। সুতরাং একই ব্যতিক্রমটি সমস্ত এসপেক্স স্ক্রিনের টিএসটি ফাইলগুলিতে লগ হয় I কেবলমাত্র আমি কেবল এই পদ্ধতিটি ব্যতীত আমার পদ্ধতি ঘোষণার ক্লাস ফাইল নিজেই পরিচালনা করতে চাই।

এএসপিএক্স ফাইল পদ্ধতি কল: এক্সেল.এক্সপোর্টডাটাসেট (ডিএসএক্সেল);

পদ্ধতির সংজ্ঞা:

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
   {                
   }
}

4
ব্যবহার করবেন না Response.Endদেখতে stackoverflow.com/a/3917180/2864740 (এবং অন্যান্য উত্তর); নোট করুন যে ব্যতিক্রমটি "প্রত্যাশিত হতে হবে" যেমনটি স্ট্যাকটি কীভাবে অবিরাম হয় (সুতরাং সেই ব্যতিক্রমটি ধরবেন না)। আপনি যদি এখনও [অন্যান্য] ব্যতিক্রমগুলি ধরতে চান তবে ব্যবহার করুন:.. catch (ThreadAbortException) { throw; /* propagate */ } catch (Exception ex) { .. }
— ব্যবহারকারীর 2864740

আপনি যে
— লগারটি

উত্তর:


198

আমি অনলাইনে গবেষণা করে দেখেছি যে 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.

4
বাহ এক গডসেন্ড। এটি WinDbg ব্যবহার করে আমার কয়েক ঘন্টা ডিবাগ সংরক্ষণ করেছিল। আমার ক্ষেত্রে, আমার w3wp.exe স্রেফ ক্র্যাশ হয়েছে যদি খুব বেশি থ্রেডঅবর্টেক্সপশন হয়
— Dio Phung

ধন্যবাদ কোডটি এই টুকরাটি সত্যই সহায়ক যদি আপনি asmx পরিষেবা নির্মাণকারীকে কিছু অনুমোদন চেক যোগ করতে চান
— vadim

এটি আমার পক্ষে কাজ করেছে। আমি প্রতিস্থাপন করেছি। এবং () প্রস্তাবিত কোড সহ এবং এটি এখন ব্যতিক্রম ছাড়াই কাজ করে। আপনাকে ধন্যবাদ, আমার এখনকার কার্য কোডটি: প্রতিক্রিয়া। কনটেন্টটাইপ = "পাঠ্য / সিএসভি"; প্রতিক্রিয়া.এডহিডার ("বিষয়বস্তু-বিশৃঙ্খলা", স্ট্রিং। ফর্ম্যাট ("সংযুক্তি; ফাইলের নাম = \" {0} \ "", পাথ.গেটফাইনেম (ফাইলপথ))); প্রতিক্রিয়া.ট্রান্সমিট ফাইল (ফাইলপথ); // রেসপন্স.এন্ড (); এইচটিটিপি কনটেক্সট.কন্টেনার.সেস্পোনস.ফ্লুশ (); HTTPContext.Current.Response.SuppressContent = সত্য; এইচটিটিপি কনটেক্সট.কর্ন্ট.এপ্লিকেশনআইনস্ট্যান্স। কমপ্লিট রিকুইস্ট ();
— Nour Lababidi

4
না। আমার জন্য কাজ করে না। আসলে উত্তর দেখুন। যদি কাজ নাResponse.End() করে তবে প্রস্তাবিত উত্তরটিও শেষ লাইনে আছে কেন? পরিবর্তে @ বিনির উত্তর (নীচে) সহায়তা করে! Response.End()
— ব্যবহারকারী3454439

4
ডকুমেন্টস অনুসারে ডকুমেন্টস.মাইক্রোসফট.এইন.ইউ / ডটনেট / এপি / সিস্টেমে.উইব.চ.টি.প্লিসপনস.এন্ড রিকোয়েস্ট.এন্ড কেবল পশ্চাতে সামঞ্জস্যের জন্য সমর্থিত। সম্পূর্ণরূপে ব্যবহারের প্রতিস্থাপন হিসাবে সুপারিশ করা হয়
— রুডল্ফ ডিভোরাসেক

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

আশা করি এটা সাহায্য করবে


4
আমার জন্য কাজ কর. উপরেরটি না। আসলে এটি মজাদার যে যখন Response.End()কাজ করে না, তবে প্রস্তাবিত পদ্ধতিটি Response.End()শেষ লাইনেও আছে?
— ব্যবহারকারীর 45454439

4
আপনি ব্যতিক্রমটি ধরা এবং লুকিয়ে রাখার কারণ।
— ড্যান ফ্রেডম্যান

4
কী ভয়াবহ সমাধান
— রেজার

4

একই প্রশ্ন হিসাবে মনে হচ্ছে:

যখন একটি এএসপি.নেট সিস্টেম. ওয়েবে.হট্টপ্রেস্পোনস.এন্ড () বলা হয়, তখনকার থ্রেডটি বাতিল হয়ে যায়?

সুতরাং এটি নকশা দ্বারা। আপনাকে এই ব্যতিক্রমটির জন্য একটি ক্যাচ যুক্ত করতে হবে এবং কৌতুকপূর্ণভাবে এটিকে "উপেক্ষা করুন" "


আমি বহু এসপেক্স স্ক্রিনগুলিতে এই সার্বজনীন অকার্যকর এক্সপোর্টডেটা সেট (ডেটাসেট ডিএস) ফাংশন বলি এবং আমি ব্যতিক্রমগুলির জন্য ত্রুটি লগার পদ্ধতি বজায় রাখছি যা রানটাইমের সময় উত্থাপিত ডানগুলি ব্যতিক্রমগুলি একটি .txt ফাইলগুলিতে লেখা হয়। সুতরাং একই ব্যতিক্রমটি সমস্ত এসপেক্স স্ক্রিনের টিএসটি ফাইলগুলিতে লগ হয় I কেবলমাত্র আমি কেবল এই পদ্ধতিটি ব্যতিরেকে আমার পদ্ধতি ঘোষণার ক্লাস ফাইলটিতে পরিচালনা করতে চাই।
— ব্যবহারকারী3171957

আপনার প্রশ্নের ব্যবহারকারীর কাছ থেকে দেওয়া মন্তব্য, কেবল TheadAbortException -> ক্যাচ (থ্রেডআবার্ট এক্সেক্সশন) catch}
— রবনিক

হ্যাঁ মেথডে ডিক্লারেশন ক্লাসে এটি ব্যতিক্রমটি নিজেই ফাইল করুন।
— ব্যবহারকারী3171957

4

সাড়া / ক্যাচ এবং ব্লক ব্যবহার করে রেসপন্স.এন্ড () -র বাইরে যান।

মনে হয় বাকী অনুরোধটি বাইপাস করার জন্য একটি ব্যতিক্রম ছুঁড়ে ফেলা হবে, আপনি কেবল এটি ধরতে পারেন নি।

bool endRequest = false;

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

if (endRequest)
    Resonse.End();

কেন এটি একটি অবশেষে ব্লকে রাখবেন না, তাই এটি সর্বদা কার্যকর করা হয়?
— গোল্ডবিশপ

আপনি এটি করতে পারেন, বিশেষত যদি চেষ্টা ব্লকে আপনার কোনও রিটার্ন বিবৃতি থাকে। তবে আপনি যদি চেষ্টা করেন / ধরেন / উপেক্ষা করেন তবে শেষ পর্যন্ত আপনার প্রয়োজনও হবে না। গুরুত্বপূর্ণ বিষয়টি হ'ল আপনার থ্রেডঅবর্টেক্সেপশনটি ধরা উচিত নয়।
— স্টিভ

সত্য, টিএই একটি সফল প্রতিক্রিয়া ফিরিয়ে দেওয়ার জন্য পিআইটিএ।
— গোল্ডবিশপ

3

শুধু রাখা

Response.End();

চেষ্টা ব্লকের পরিবর্তে অবশেষে একটি ব্লকের মধ্যে।

এটি আমার জন্য কাজ করেছে !!!।

আমার নিম্নলিখিত সমস্যাযুক্ত (ব্যতিক্রম সহ) কোড কাঠামো ছিল

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

   return;

 } 

 some_more_code...

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

}
catch(Exception){
}
finally{}

এবং এটি ব্যতিক্রম ছোঁড়ে। আমি সন্দেহ করি যে রেসপন্সের পরে কার্যকর করার জন্য কোড / কাজ রয়েছে সেখানে ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছে; এবং (); । আমার ক্ষেত্রে অতিরিক্ত কোডটি ছিল কেবল নিজের ফিরে আসা।

যখন আমি সবেমাত্র প্রতিক্রিয়া সরিয়েছি E এবং (); শেষ অবধি (এবং তার জায়গায় ফিরে আসা ছেড়ে দিল - যার ফলে ট্রাই ব্লকটিতে বাকী কোডটি এড়িয়ে যাওয়া এবং শেষ অবধি ব্লককে ঝাঁপিয়ে দেওয়া (কেবলমাত্র উপস্থিত ফাংশনটি প্রস্থান করে না) ব্যতিক্রম হওয়া বন্ধ হয়ে যায়।

নিম্নলিখিতটি ঠিক আছে:

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

   return;

 } 

 some_more_code...

 Reponse.Write(...);

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

3

রেসপন্স.এন্ড () পদ্ধতিটি বাদ দিয়ে একটি বিশেষ ক্যাচ ব্লক ব্যবহার করুন

{
    ...
    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

আমার জন্য শুধুমাত্র কাজ করে

এইচটিটিপি কনটেক্সট.কেনরেট.এপ্লিকেশনআইনস্ট্যান্স.কমলিউটার রিকোয়েস্ট ()।

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


4
ডকুমেন্টস অনুসারে ডকুমেন্টস.মাইক্রোসফট.এইন.ইউ / ডটনেট / এপি / সিস্টেমে.উইব.চ.টি.প্লিসপনস.এন্ড রিকোয়েস্ট.এন্ড কেবল পশ্চাতে সামঞ্জস্যের জন্য সমর্থিত। সম্পূর্ণরূপে ব্যবহারের প্রতিস্থাপন হিসাবে সুপারিশ করা হয়
— রুডল্ফ ডিভোরাসেক

2

আমি আপডেটপ্যানেল থেকে লিঙ্কবটনটি সরিয়েছি এবং প্রতিক্রিয়াও মন্তব্য করেছি nd এবং () সাফল্য !!!


1

রেসপন্সের জন্য ত্রুটি। END (); কারণ আপনি একটি এসপি আপডেট প্যানেল বা কোনও নিয়ন্ত্রণ ব্যবহার করছেন যা জাভাস্ক্রিপ্ট ব্যবহার করে, জাভাস্ক্রিপ্ট বা স্ক্রিপ্ট ম্যানেজার বা স্ক্রিপ্টিং ছাড়াই এসপি বা এইচটিএমএল থেকে নিয়ন্ত্রণ নেটিভ ব্যবহার করার চেষ্টা করুন এবং আবার চেষ্টা করুন


1

এটি ইস্যু নয় তবে এটি নকশা দ্বারা। মূল কারণটি মাইক্রোসফ্ট সমর্থন পৃষ্ঠায় বর্ণিত হয়েছে।

রেসপন্স.এন্ড পদ্ধতিটি পৃষ্ঠার কার্য সম্পাদন শেষ করে এবং প্রয়োগের ইভেন্ট পাইপলাইনে প্রয়োগটিকে অ্যাপ্লিকেশন_অ্যান্ডরেউকেষ্ট ইভেন্টে স্থানান্তরিত করে। কোডের রেখাটি রেসপন্স অনুসরণ করে। এবং কার্যকর করা হয় না।

প্রদত্ত সমাধানটি হ'ল:

প্রতিক্রিয়া.আর জন্য, রেসপন্সের পরিবর্তে HttpContext.Current.ApplicationInstance.CompleteRequest পদ্ধতিতে কল করুন Application অ্যাপ্লিকেশন_এন্ডআরকোয়েস্ট ইভেন্টে কোড এক্সিকিউশনটি বাইপাস করুন

এখানে লিঙ্কটি দেওয়া হয়েছে: https://support.microsoft.com/en-us/help/312629/prb-threadabortexception-occurs-if-you-use-response-end--response-redi


0

প্রতিক্রিয়া দেওয়ার আগে ক্লায়েন্টের প্রতিক্রিয়াটি ফ্লাশ করুন end

রেসপন্স.ফ্লাশ পদ্ধতি সম্পর্কে আরও

সুতরাং নীচে উল্লিখিত কোডটি আগে ব্যবহার করুন response.End();

response.Flush();  

0

আমি উপরের সমস্ত পরিবর্তন ব্যবহার করেছিলাম তবুও আমি আমার ওয়েব অ্যাপ্লিকেশনটিতে একই সমস্যা পেয়েছি।

তারপরে আমি আমার হোস্টিং সরবরাহের সাথে যোগাযোগ করেছি এবং তাদের এইচটিটিপি এর মাধ্যমে স্থানান্তর করতে কোনও ফাইল বা অ্যান্টিভাইরাস আমাদের ফাইলগুলি ব্লক করছে কিনা তা পরীক্ষা করতে বলেছি। বা আইএসপি / নেটওয়ার্ক ফাইল স্থানান্তর করার অনুমতি দিচ্ছে না।

তারা সার্ভার সেটিংস পরীক্ষা করে এবং আমার সার্ভারের জন্য "ডেটা সেন্টার শেয়ার্ড ফায়ারওয়াল" বাইপাস করে এবং এখন আমাদের অ্যাপ্লিকেশন ফাইলটি ডাউনলোড করতে সক্ষম।

আশা করি এই উত্তরটি কাউকে সহায়তা করবে his এটি আমার পক্ষে কাজ করেছে


এটি কার্যকর হতে পারে, এটি একটি কঠিন সমাধান হিসাবে শোনাচ্ছে না। আপনি কি বলছেন ফায়ারওয়াল পুরোপুরি অক্ষম? এটি একটি বড় "না" হবে। বা এটি আপনার অ্যাপ্লিকেশনটির জন্য কাস্টমাইজ করা হয়েছে? ডেটাসেন্টার ফায়ারওয়াল ব্লকগুলির কোনও কিছুর উপর একটি থ্রেডঅবর্ট এক্সপ্লেশন দেখতেও অদ্ভুত… অন্য কথায়, প্রশ্নের উত্তর নয়?
— মাইকেল


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);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.