আমি যখন কল Response.Redirect(someUrl)
করি তখন নীচের এইচটিপিএক্সসেপশনটি পাই:
HTTP শিরোনাম প্রেরণের পরে পুনঃনির্দেশ করা যায় না।
আমি এটা কেন পাব? এবং আমি কীভাবে এই সমস্যাটি সমাধান করতে পারি?
আমি যখন কল Response.Redirect(someUrl)
করি তখন নীচের এইচটিপিএক্সসেপশনটি পাই:
HTTP শিরোনাম প্রেরণের পরে পুনঃনির্দেশ করা যায় না।
আমি এটা কেন পাব? এবং আমি কীভাবে এই সমস্যাটি সমাধান করতে পারি?
উত্তর:
এমএসডিএন ডকুমেন্টেশন অনুসারে Response.Redirect(string url)
, "এইচটিটিপি শিরোনাম প্রেরণের পরে পুনর্নির্দেশের চেষ্টা করা হলে" এটি একটি এইচটিপিএক্সসেপশন নিক্ষেপ করবে। যেহেতু Response.Redirect(string url)
এইচটিটিপি "অবস্থান" প্রতিক্রিয়া শিরোনাম ( http://en.wikedia.org/wiki/HTTP_headers#Responses ) ব্যবহার করে, এটি কল করলে শিরোনাম ক্লায়েন্টের কাছে প্রেরণ হবে। এর অর্থ হ'ল আপনি যদি দ্বিতীয় বার এটি কল করেন বা হেডারকে অন্য কোনও উপায়ে প্রেরণ করার পরে আপনি যদি এটি কল করেন তবে আপনি এইচটিপিএক্সসেপশন পাবেন।
রেসপন্স কল করার বিরুদ্ধে রক্ষা করার এক উপায় R পুনঃনির্দেশ () একাধিকবার Response.IsRequestBeingRedirected
সম্পত্তি (কল) কল করার আগে এটি পরীক্ষা করা।
// Causes headers to be sent to the client (Http "Location" response header)
Response.Redirect("http://www.stackoverflow.com");
if (!Response.IsRequestBeingRedirected)
// Will not be called
Response.Redirect("http://www.google.com");
endResponse
) সত্য হিসাবে সেট করা হয়েছে।"
Response.IsRequestBeingRedirected
মিথ্যা এবং আমি এখনও এই একই ব্যতিক্রম পাচ্ছি ( Application_EndRequest
গ্লোবাল.অ্যাক্সে ইভেন্ট পদ্ধতিটির ভিতরে ) কেন বুঝতে পারছি না।
একবার আপনি কোনও ক্লায়েন্টকে কোনও সামগ্রী প্রেরণ করার পরে, HTTP শিরোনাম ইতিমধ্যে প্রেরণ করা হয়েছে। একটি Response.Redirect()
কল শিরোনামগুলিতে বিশেষ তথ্য প্রেরণে কাজ করে যা ব্রাউজারকে একটি ভিন্ন ইউআরএল চাইবে।
শিরোনামগুলি ইতিমধ্যে প্রেরণ করা হয়েছে, Asp.net আপনি যা চান তা করতে পারে না (শিরোনাম সংশোধন করুন)
আপনি ক এর মাধ্যমে এটি পেতে পারেন) হয় অন্য কিছু করার আগে পুনঃনির্দেশ করা বা খ) Response.Buffer = true
অন্য কিছু করার আগে ব্যবহার করার চেষ্টা করুন , নিশ্চিত হয়ে নিন যে পুরো পৃষ্ঠাটি সম্পাদন না হওয়া অবধি ক্লায়েন্টকে কোনও আউটপুট প্রেরণ করা হচ্ছে না।
একটি পুনঃনির্দেশ তখনই ঘটতে পারে যখন এইচটিটিপি বার্তার প্রথম লাইন " HTTP/1.x 3xx Redirect Reason
" হয়।
যদি আপনি ইতিমধ্যে Response.Write()
কিছু শিরোনাম কল করেছেন বা সেট করেছেন তবে পুনঃনির্দেশের জন্য খুব দেরী হবে। Response.Headers.Clear()
এটি আপনাকে সাহায্য করে কিনা তা দেখতে আপনি পুনর্নির্দেশের আগে কল করার চেষ্টা করতে পারেন।
return RedirectToAction("Logout", "Authentication");
এবং আমি সেই ত্রুটিটি
আপনি বাফারিং বিকল্পটি মিথ্যাতে সেট করেছেন কিনা তা পরীক্ষা করে দেখুন (ডিফল্টরূপে এটি সত্য)। প্রতিক্রিয়া জন্য
Response.BufferOutput = true;
কন্ট্রোলারে?
আপনি নীচে উল্লিখিত কোডও ব্যবহার করতে পারেন
Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();
এর জন্য একটি সহজ উত্তর রয়েছে: আপনি শিরোনাম পাঠানোর আগে আপনি অন্য কিছু যেমন পাঠ্য বা আপনার পৃষ্ঠা থেকে আউটপুট সম্পর্কিত কিছু আউটপুট পেয়েছেন। আপনি কেন ত্রুটি পান তা এটি প্রভাবিত করে।
পজিবল আউটপুট জন্য কেবল আপনার কোড পরীক্ষা করুন বা আপনি আপনার পদ্ধতির শীর্ষে শিরোনাম রাখতে পারেন যাতে এটি প্রথমে প্রেরণ হবে।
আপনি যদি শিরোনামগুলি প্রেরণের পরে পুনঃনির্দেশের চেষ্টা করছেন (উদাহরণস্বরূপ, আপনি একটি আংশিক উত্পন্ন পৃষ্ঠা থেকে পুনর্নির্দেশের একটি ত্রুটি করছেন), আপনি কিছু ক্লায়েন্ট জাভাস্ক্রিপ্ট (লোকেশন.রেপ্লেস বা লোকেশন.href ইত্যাদি) প্রেরণ করতে পারেন) আপনি চান URL- এ পুনর্নির্দেশ করতে। অবশ্যই, এটি এইচটিএমএল ইতিমধ্যে কি নীচে পাঠানো হয়েছে তার উপর নির্ভর করে।
"এইচটিটিপি শিরোনাম প্রেরণের পরে পুনর্নির্দেশ করা যায় না" পরিচালনা করতে ব্যতিক্রম হ্যান্ডলার যুক্ত করে আমার ইস্যুটি সমাধান হয়ে গেছে। কোডের নীচে প্রদর্শিত হিসাবে এই ত্রুটি
catch (System.Threading.ThreadAbortException)
{
// To Handle HTTP Exception "Cannot redirect after HTTP headers have been sent".
}
catch (Exception e)
{//Here you can put your context.response.redirect("page.aspx");}
HTTP শিরোনাম প্রেরণের পরে ত্রুটি পুনঃনির্দেশ করা যায় না।
System.Web.HttpException (0x80004005): HTTP শিরোনাম প্রেরণের পরে পুনঃনির্দেশ করা যায় না।
পরামর্শ
আমরা যদি এসপ নেটওয়্যার এমভিসি ব্যবহার করি এবং একই নিয়ামক হিসাবে কাজ করি এবং বিভিন্ন ক্রিয়ায় পুনর্নির্দেশ করি তবে আপনার লেখার দরকার নেই ..
রেসপন্স.ডরাইডেক্ট ("অ্যাকশননাম", "কন্ট্রোলারনাম");
কেবল
রিটার্নটোটো অ্যাকশন ("অ্যাকশননাম") ব্যবহার করা ভাল ;
বা
দেখুন ("ভিউনাম") রিটার্ন করুন;
আপনি যদি HTTP শিরোনাম প্রেরণের পরে পুনর্নির্দেশ করতে না পারেন তবে নীচের কোডটি চেষ্টা করে দেখুন।
HttpContext.Current.Server.ClearError();
// Response.Headers.Clear();
HttpContext.Current.Response.Redirect("/Home/Login",false);
এটি ঠিক করার জন্য 2 টি উপায় রয়েছে:
return
আপনার পরে কেবল একটি বিবৃতি যুক্ত করুন Response.Redirect(someUrl);
(যদি পদ্ধতিটির স্বাক্ষরটি "অকার্যকর" না হয়, আপনাকে অবশ্যই "টাইপ" অবশ্যই দিতে হবে) অবশ্যই:
প্রতিক্রিয়া.প্রশিক্ষণ ("লগইন.এএসপিএক্স");
প্রত্যাবর্তন
নোট করুন রিটার্নটি সার্ভারকে পুনঃনির্দেশ সম্পাদন করতে দেয় ... এটি ছাড়া সার্ভারটি আপনার বাকী কোডটি চালিয়ে যেতে চায় ...
Response.Redirect(someUrl)
ব্যতিক্রমটি ছুঁড়ে ফেলেছে এমন পদ্ধতিতে আপনার সর্বশেষ সম্পাদিত বিবৃতিটি তৈরি করুন । আপনার Response.Redirect(someUrl)
"কিছু ইউআরএল" নামের একটি স্ট্রিং ভেরিয়েবলের সাথে প্রতিস্থাপন করুন এবং এটিকে পুনর্নির্দেশের স্থানে সেট করুন ... নীচে://......some code
string someUrl = String.Empty
..... কিছু যুক্তি
if (x=y)
{
// comment (original location of Response.Redirect("Login.aspx");)
someUrl = "Login.aspx";
}
...... আরও কোড
// আপনার প্রতিক্রিয়া সরান। এখানে পুনর্নির্দেশ (পদ্ধতির সমাপ্তি):
Response.Redirect(someUrl);
return;
return
? return
শুধুমাত্র সংজ্ঞায়িত যে পদ্ধতি সম্পন্ন হয়। কিন্তু যখন কোনও কোড বাকি নেই, পদ্ধতিটি যাইহোক সম্পন্ন হবে। এবং একটি ভেরিয়েবলে একটি ইউআরএল সংরক্ষণ করা কোনও পরিবর্তন করে না, আমার অর্থ: এটি কেন করা উচিত? স্ট্রিং একই। সংকলিত জিনিসটি স্ট্রিং এবং স্ট্রিংযুক্ত ভেরিয়েবলের মধ্যে কোনও পার্থক্য রাখে না ...: চিন্তা করুন x = 5
, সুতরাং x 5 কিন্তু 5 এছাড়াও 5 even এমনকি 10/2 5ও হবে ... কোন পার্থক্য নেই