রেসপন্স.ডরেডেক্ট কেন সিস্টেম.ট্রেডিং.ট্রেডঅবর্টেক্সপশন?


230

আমি যখন আমার ফর্মটি নতুন পৃষ্ঠায় পুনঃনির্দেশ করতে রেসপন্স (রিডাইরেক্ট (...) ব্যবহার করি তখন ত্রুটিটি পাই:

'সিস্টেম.Threading.ThreadAbortException' টাইপ প্রথমবারের মতো ব্যতিক্রম হয়েছে mscorlib.dll
টাইপ 'System.Threading.ThreadAbortException' টাইপ ব্যতিক্রম mscorlib.dll এ এসেছিল তবে ব্যবহারকারীর কোডে পরিচালিত হয়নি

আমার এই বিষয়টি বোঝার অর্থ হ'ল যে ওয়েবসভারটি পৃষ্ঠার বাকী অংশটি বাতিল করে দেওয়ার কারণে সমস্যাটি ঘটছে।

আমি জানি যে এর সাথে আমি দ্বিতীয় প্যারামিটার যুক্ত করতে Response.Redirectপারি যার নাম এন্ড্রেস্পোনস। যদি আমি এড্রেসপন্স ট্রুতে সেট করি তবে আমি ত্রুটিটি পাই তবে যদি আমি এটি মিথ্যাতে সেট করি তবে আমি তা করি না। আমি যথেষ্ট নিশ্চিত যদিও এর অর্থ এই যে যে ওয়েবসারভারটি আমার থেকে দূরে সরে যাওয়া বাকী পৃষ্ঠাটি চালাচ্ছে। যা কমপক্ষে বলতে অক্ষম বলে মনে হবে। এই কাজ করতে একটি ভাল উপায় আছে কি? Response.Redirectপুরানো পৃষ্ঠাটি লোড করা বন্ধ করতে বাধ্য করার উপায় ছাড়া অন্য কিছু আছে যেখানে আমি পাই না ThreadAbortException?

উত্তর:


332

সঠিক প্যাটার্নটি হ'ল রিডাইরেক্ট ওভারলোডকে এন্ডারেস্পোনস = মিথ্যা দিয়ে কল করুন এবং আইআইএস পাইপলাইনটি বলার জন্য একটি কল করুন যে আপনি নিয়ন্ত্রণ ফিরে আসার পরে এটি সরাসরি এন্ড্রয়েস্ট পর্বে যেতে হবে:

Response.Redirect(url, false);
Context.ApplicationInstance.CompleteRequest();

টমাস মার্কুয়ার্ডের এই ব্লগ পোস্টটি কীভাবে একটি অ্যাপ্লিকেশন_এরর হ্যান্ডলারের মধ্যে পুনর্নির্দেশের বিশেষ কেসটি পরিচালনা করতে পারে সে সম্পর্কিত অতিরিক্ত বিবরণ সরবরাহ করে।


6
এটি পরে কোড কার্যকর করে Context.ApplicationInstance.CompleteRequest();। কেন? আমার কি returnশর্তাধীন ইভেন্ট হ্যান্ডলারটি থেকে আসতে হবে ?
ইসমাইলস

4
@ ইসমাইল: পুনর্নির্দেশের পুরাতন সংস্করণ পরবর্তী কোনও কোড কার্যকর করা রোধ করতে একটি থ্রেডঅবর্ট এক্সেকশন নিক্ষেপ করে। নতুন, পছন্দসই সংস্করণ নিক্ষেপ করবে না, তবে যদি হ্যান্ডলারের অতিরিক্ত কোড থাকে তবে আপনি তাড়াতাড়ি নিয়ন্ত্রণ ফিরিয়ে আনতে দায়বদ্ধ।
জোয়েল ফিলমোর

12
আমি মনে করি The old version of Redirectআপনি নিজের মন্তব্যে যে বাক্যটি ব্যবহার করেছেন তার চেয়ে "দ্বিতীয় ওভারলোড" বলা আরও সঠিক , এমএস বাস্তবায়ন বদলেছে তা ঠিক নয়, এটি কেবল অন্য একটি ওভারলোড।
জন্ম

2
আমি মনে করি না এটি একটি আদর্শ নিদর্শন। আপনি পৃষ্ঠাটিকে অনুরোধটি শেষ না করে এবং কার্যকর করা চালিয়ে যেতে এবং তারপরে প্রোগ্রামটিভভাবে অনুরোধটি সম্পূর্ণ করতে বলছেন। তবে এসপেক্স পৃষ্ঠা এবং ইভেন্ট হ্যান্ডলারের রেন্ডারিং সম্পর্কে কী বলা যায়? প্রতিক্রিয়া শেষ না করা মানে, এটি "সম্পূর্ণরূপে ()" চাপ দেওয়ার আগে এসপেক্স পৃষ্ঠাটি সরবরাহ করা শেষ করবে। এখন আমি যদি আমার পৃষ্ঠায় একটি সার্ভার পাশের সম্পত্তি ব্যবহার করছি তবে বৈধ লগইন নির্ধারণের জন্য একটি সেশন ভেরিয়েবল বলব, যা মেয়াদ শেষ হলে পুনঃনির্দেশের আগে নাল ব্যতিক্রম ছুঁড়ে দেবে। এবং এটির সমাধানের একমাত্র উপায় হ'ল এন্ডারেস্পোনসটিকে সত্যে ফিরে আসা।
Abs

1
এই উত্তরে ভোট দিতে যাচ্ছিল তবে সেই পৃষ্ঠা কোডটি কার্যকর করে চলেছে। এটি আমার ক্ষেত্রে আদর্শ নয়। "থ্রেডআবার্ট এক্সপ্লেশন" পরিচালনা বা উপেক্ষা করার জন্য অনেক ক্লিনার
দানিদেব

159

নেই কোন সহজ এবং মার্জিত সমাধান RedirectASP.Net ওয়েবফর্মগুলি সমস্যা। আপনি ডার্টি সলিউশন এবং ক্লান্তিকর সমাধানের মধ্যে বেছে নিতে পারেন

নোংরা : Response.Redirect(url)ব্রাউজারে পুনর্নির্দেশ পাঠায় এবং তারপরে ThreadAbortedExceptionবর্তমান থ্রেডটি শেষ করতে একটি নিক্ষেপ করে । সুতরাং কোনও কোড পুনর্নির্দেশ () - কলের আগে কার্যকর করা হয় না। ডাউনসাইডস: এটি খারাপ অনুশীলন এবং এর মতো থ্রেডগুলি মারতে পারফরম্যান্সের সাথে জড়িত। এছাড়াও, ThreadAbortedExceptionsব্যতিক্রম লগিং প্রদর্শিত হবে।

ক্লান্তিকর : প্রস্তাবিত উপায়টি কল করা Response.Redirect(url, false)এবং তারপরেও Context.ApplicationInstance.CompleteRequest()কোড সম্পাদনা অব্যাহত থাকবে এবং পৃষ্ঠা লাইফসাইলে থাকা ইভেন্ট ইভেন্টের বাকি অংশগুলি এখনও কার্যকর করা হবে। (উদাহরণস্বরূপ, যদি আপনি পেজ_লুডে পুনঃনির্দেশ সম্পাদন করেন তবে কেবলমাত্র বাকি হ্যান্ডলারকেই কার্যকর করা হবে না, পেজ_প্রেেন্ডার এবং আরও কিছু কল করা হবে - রেন্ডারযুক্ত পৃষ্ঠাটি কেবল ব্রাউজারে প্রেরণ করা হবে না by আপনি অতিরিক্ত প্রক্রিয়াটি এড়াতে পারবেন উদাহরণস্বরূপ পৃষ্ঠায় একটি পতাকা স্থাপন, এবং তারপরে ইভেন্ট হ্যান্ডেলাররা কোনও প্রক্রিয়াজাতকরণের আগে এই পতাকাটি পরীক্ষা করতে দিন।

(ডকুমেন্টেশনে বর্ণিত CompleteRequestহয়েছে যে এটি " এএসপি.এনইটিকে সমস্ত ঘটনা বাইপাস এবং এক্সিকিউশনের এইচটিটিপি পাইপলাইন চেইনে ফিল্টারিংয়ের কারণ করে" This এটি সহজেই ভুল বোঝা যায় It এটি আরও এইচটিটিপি ফিল্টার এবং মডিউলগুলি বাইপাস করে, তবে এটি পরবর্তী ইভেন্টগুলি বাইপাস করে না বর্তমান পৃষ্ঠায় জীবনকালীন।)

আরও গভীর সমস্যাটি হ'ল ওয়েবফোর্ডগুলিতে বিমূর্ততার স্তরের অভাব রয়েছে। আপনি যখন কোনও ইভেন্ট হ্যান্ডলারটিতে থাকবেন, আপনি ইতিমধ্যে আউটপুট থেকে কোনও পৃষ্ঠা তৈরির প্রক্রিয়াতে রয়েছেন। কোনও ইভেন্ট হ্যান্ডলারে পুনর্নির্দেশ করা কুশ্রী কারণ আপনি কোনও ভিন্ন পৃষ্ঠা উত্পন্ন করার জন্য আংশিক উত্পন্ন পৃষ্ঠাটি বন্ধ করছেন। নিয়ন্ত্রণ প্রবাহ রেন্ডারিং ভিউ থেকে পৃথক থাকায় এমভিসির এই সমস্যা নেই, সুতরাং আপনি RedirectActionকোনও ভিউ তৈরি না করেই কেবল নিয়ামককে একটি ফিরিয়ে দিয়ে একটি পরিষ্কার পুনর্নির্দেশ করতে পারেন ।


7
আমি বিশ্বাস করি যে আমি যে ওয়েবফর্মগুলি শুনেছি তার মধ্যে সেরা বর্ণনা "মিথ্যা সস"।
এমসিফিয়া

9
আমি এই উত্তরে বিস্তারিত পরিমাণ পছন্দ। গৃহীত উত্তরের চেয়ে ভাল
জেস

আপনি যদি নোংরা বিকল্পটি ব্যবহার করেন , আপনি ভিজ্যুয়াল স্টুডিওতে থ্রেডঅবার্ট এক্সপ্লেশন বন্ধ করতে পারেন। ডিবাগ> ব্যতিক্রমসমূহ ...সিএলআর> সিস্টেম.ট্রেডিং> আনচেক সিস্টেম.ট্রেডিং T থ্রেডঅবর্টেক্সপশন প্রসারিত করুন ।
জেস

godশ্বরকে ধন্যবাদ আমাদের কাছে যথাযথ উত্তর সহ কেউ আছে এবং এটি সর্বোচ্চ ভোট দেওয়া উত্তর হওয়া উচিত।
Abs

1
আমার ক্ষেত্রে এই ব্যতিক্রম প্রতিবারের জন্য আসবে না, কেবলমাত্র এর মধ্যে কয়েকবারই এটি ঘটছে। মানে যদি লাইভ অ্যাপ্লিকেশনটির একই বোতামটি ক্লিক করে এটি কাজ করছে তবে যখন একই লিঙ্ক এবং একই বোতামটি অন্য মেশিন থেকে ক্লিক করা হয় এটি সিস্টেম। থ্রেডিং T থ্রেডঅবর্টেক্সপশন দেয়। কোনও ধারণা কেন এটি প্রতিবার ঘটছে না ??
সাগর শির্কে

33

আমি জানি আমি দেরি করে এসেছি, তবে আমার যদি Response.Redirectকোনও Try...Catchব্লক হয় তবে আমার কেবল কখনও এই ত্রুটি ছিল ।

কখনও কোনও প্রতিক্রিয়া রাখবেন না ... চেষ্টা করুন ... ক্যাচ ব্লকে পুনর্নির্দেশ করুন। এটা খারাপ অভ্যাস

সম্পাদন করা

@ কুইকিটের মন্তব্যের প্রতিক্রিয়া হিসাবে, প্রতিক্রিয়াটি রাখার বিকল্প হিসাবে আমি যা করব তা এখানে রয়েছে Tryপরে চেষ্টা করুন ... ক্যাচ ব্লকে পুনর্নির্দেশ করুন।

আমি পদ্ধতিটি / ফাংশনটি দুটি ধাপে বিভক্ত করতাম।

চেষ্টা করার ভিতরে প্রথম ধাপ ... ক্যাচ ব্লকটি অনুরোধ করা ক্রিয়াগুলি সম্পাদন করে এবং ক্রিয়াগুলির সাফল্য বা ব্যর্থতা নির্দেশ করতে একটি "ফলাফল" মান সেট করে।

চেষ্টা করুন এর বাইরে দুই ধাপ ... "ফলাফল" মানটি কী তার উপর নির্ভর করে ক্যাচ ব্লক পুনর্নির্দেশ করে (বা না) করে।

এই কোডটি নিখুঁত থেকে দূরে এবং সম্ভবত এটি অনুলিপি করা উচিত নয় যেহেতু আমি এটি পরীক্ষা করে নিই

public void btnLogin_Click(UserLoginViewModel model)
{
    bool ValidLogin = false; // this is our "result value"
    try
    {
        using (Context Db = new Context)
        {
            User User = new User();

            if (String.IsNullOrEmpty(model.EmailAddress))
                ValidLogin = false; // no email address was entered
            else
                User = Db.FirstOrDefault(x => x.EmailAddress == model.EmailAddress);

            if (User != null && User.PasswordHash == Hashing.CreateHash(model.Password))
                ValidLogin = true; // login succeeded
        }
    }
    catch (Exception ex)
    {
        throw ex; // something went wrong so throw an error
    }

    if (ValidLogin)
    {
        GenerateCookie(User);
        Response.Redirect("~/Members/Default.aspx");
    }
    else
    {
        // do something to indicate that the login failed.
    }
}

@ কিকিনেট দয়া করে আমি কী করব তার উদাহরণের জন্য আমার আপডেট হওয়া উত্তরটি দেখুন। এটির সর্বোত্তম কোর্সটি বলা না, তবে এটি আমার মনে হয় একটি কার্যকর বিকল্প alternative
অর্টান্ড

যতক্ষণ না আমি একটি চেষ্টা আমার কোড আবৃত ইস্যু আছে কি না, ধরা ... আমি ভাবছি অন্য কোড কল .NET মধ্যে এই আচরণ কারণ
আকর্ষণীয়-নাম-এখানে

8

Response.Redirect() বর্তমান অনুরোধ বাতিল করতে ব্যতিক্রম ছুঁড়েছে।

এই কেবি নিবন্ধটি এই আচরণটি বর্ণনা করে ( পদ্ধতি Request.End()এবং Server.Transfer()পদ্ধতিগুলির জন্যও )।

কারণ Response.Redirect()সেখানে একটি ওভারলোড রয়েছে:

Response.Redirect(String url, bool endResponse)

যদি আপনি এন্ডারস্পোন = মিথ্যা পাস করেন তবে ব্যতিক্রমটি ছুঁড়ে দেওয়া হবে না (তবে রানটাইমটি বর্তমান অনুরোধটির প্রক্রিয়া চালিয়ে যাবে)।

যদি EndResponse = সত্য (বা অন্য ওভারলোড ব্যবহৃত হয়), ব্যতিক্রম নিক্ষেপ করা হবে এবং বর্তমান অনুরোধটি অবিলম্বে বন্ধ হয়ে যাবে।


7

সমস্যাটির সরকারী লাইনটি এখানে (আমি সর্বশেষটি খুঁজে পেলাম না, তবে আমি মনে করি না। নেট এর পরবর্তী সংস্করণগুলির জন্য পরিস্থিতি পরিবর্তিত হয়েছে)


5
লিঙ্ক পচা নির্বিশেষে @ এসভিক, কেবলমাত্র লিঙ্কের উত্তরগুলি সত্যিই দুর্দান্ত উত্তর নয়। meta.stackexchange.com/q/8231 I think that links are fantastic, but they should never be the only piece of information in your answer.
রায়ান গেটস

7

এটা ঠিক কিভাবে Response.Redirect(url, true) কাজ করে। এটি ThreadAbortExceptionথ্রেডটি বাতিল করতে ছুড়ে দেয় । কেবল সেই ব্যতিক্রমটিকে উপেক্ষা করুন। (আমি ধারণা করি এটি কোনও বিশ্বব্যাপী ত্রুটি হ্যান্ডলার / লগার যেখানে আপনি এটি দেখেন?)

একটি উত্সাহব্যঞ্জক সংশ্লিষ্ট আলোচনা হয় Response.End()ক্ষতিকর বিবেচনা?


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

3

এছাড়াও আমি অন্যান্য সমাধান চেষ্টা করেছিলাম, তবে কিছু কোড পুনর্নির্দেশের পরে কার্যকর করা হয়েছিল।

public static void ResponseRedirect(HttpResponse iResponse, string iUrl)
    {
        ResponseRedirect(iResponse, iUrl, HttpContext.Current);
    }

    public static void ResponseRedirect(HttpResponse iResponse, string iUrl, HttpContext iContext)
    {
        iResponse.Redirect(iUrl, false);

        iContext.ApplicationInstance.CompleteRequest();

        iResponse.BufferOutput = true;
        iResponse.Flush();
        iResponse.Close();
    }

পুনঃনির্দেশের পরে যদি কোড এক্সিকিউশনটি রোধ করা দরকার

try
{
   //other code
   Response.Redirect("")
  // code not to be executed
}
catch(ThreadAbortException){}//do there id nothing here
catch(Exception ex)
{
  //Logging
}

1
শুধু জর্জি উত্তর অনুসরণ করুন। এটি থ্রেড অ্যাওর্ট ব্যতিক্রমটির লগিংটি ectically সরিয়ে ফেলবে।
ম্যাক্সিম লাভারভ

যখন কেউ জিজ্ঞাসা করেন তিনি কেন ব্যতিক্রম হন, তাকে কেবল চেষ্টা করে খেলতে বলুন .c গৃহীত উত্তর দেখুন। "দেরিতে উত্তর" পর্যালোচনা করার সময় আমি আপনার উত্তরে মন্তব্য করেছি
মানুয়েল 17'14

রেসপন্সের দ্বিতীয় আর্গুমেন্টের পক্ষে মিথ্যা রাখার মতো একই প্রভাব রয়েছে ed পুনর্নির্দেশ, তবে থ্রেডঅবর্টেক্সেপশন ক্যাপচারের চেয়ে "ভুয়া" একটি উত্তম সমাধান। আমি দেখতে পাচ্ছি না যে এইভাবে করার জন্য কোনও ভাল কারণ আছে ever
নিকজি

2

এমনকি আমি এটিকে এড়াতে চেষ্টা করেছি, কেবল থ্রেডে ম্যানুয়ালি অ্যাওর্ট করার ক্ষেত্রে, তবে আমি বরং এটি "কমপ্লিটরেক্সেস্ট" দিয়ে রেখে এগিয়ে চলেছি - যাইহোক আমার কোডটিতে পুনর্নির্দেশের পরে কমান্ডগুলির রিটার্ন রয়েছে। সুতরাং এটি করা যেতে পারে

public static void Redirect(string VPathRedirect, global::System.Web.UI.Page Sender)
{
    Sender.Response.Redirect(VPathRedirect, false);
    global::System.Web.UI.HttpContext.Current.ApplicationInstance.CompleteRequest();
}

1

আমি যা করি তা হ'ল এই ব্যতিক্রমটিকে ধরতে, অন্য এক সম্ভাব্য ব্যতিক্রমের সাথে। আশা করি এটি কারও সাহায্য করবে।

 catch (ThreadAbortException ex1)
 {
    writeToLog(ex1.Message);
 }
 catch(Exception ex)
 {
     writeToLog(ex.Message);
 }

2
বেটার এড়ানোর ThreadAbortException ব্যতিক্রম চেয়ে ধরা ও কিছুই করতে ?
কিকিনেট

-1

আমি খুব যে সমস্যা ছিল।

এর Server.Transferপরিবর্তে ব্যবহার করার চেষ্টা করুনResponse.Redirect

আমার জন্য কাজ করেছেন।


2
সার্ভার.টান্সফারটিতে এখনও একটি থ্রেডঅবর্টেক্সপশন নিক্ষেপ করা উচিত: সমর্থন. , সুতরাং এটি কোনও প্রস্তাবিত সমাধান নয়।
জোয়েল বেকহ্যাম

9
সার্ভার.টান্সফার ব্যবহারকারীকে পুনর্নির্দেশ পাঠাবে না। পুরোপুরি এর আলাদা উদ্দেশ্য রয়েছে!
মার্সেল

1
সার্ভার.টান্সফার এবং রেসপন্স.ড্রাইরেক্ট আলাদা
mzonerz
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.