আমি যখন রেসপন্স কল করি তখন কেন আমি "HTTP শিরোনাম প্রেরণের পরে পুনর্নির্দেশ করতে পারছি না"? কেন?


85

আমি যখন কল Response.Redirect(someUrl)করি তখন নীচের এইচটিপিএক্সসেপশনটি পাই:

HTTP শিরোনাম প্রেরণের পরে পুনঃনির্দেশ করা যায় না।

আমি এটা কেন পাব? এবং আমি কীভাবে এই সমস্যাটি সমাধান করতে পারি?

উত্তর:


121

এমএসডিএন ডকুমেন্টেশন অনুসারে 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");

4
হ্যাঁ ঠিক এটিএসপি নেট নেট এমভিসি 4 এবং ব্যতিক্রম ফিল্টার ইত্যাদির সাহায্যে এটি খুব সহজেই ঘটে 1 301/302 পুনর্নির্দেশের পরে আপনি HTTP প্রতিক্রিয়া স্থিতি কোডটিও পরিবর্তন করতে পারবেন না।
জানস

আমি আমার পৃষ্ঠায় 'স্থিতিশীল'
সাল

4
আপনার সম্পত্তি স্থিতিশীল করা একটি বিপজ্জনক সমাধান
প্রসপেক্টর

ThreadAbortException (প্রথমবার থেকে) ধরা না পড়লে কীভাবে পুনঃনির্দেশটিকে দ্বিতীয়বার বলা যেতে পারে? :} "দ্বিতীয় প্যারামিটারের সাথে রিডাইরেক্টকে কল করা পুনর্নির্দেশের সমতুল্য ( endResponse) সত্য হিসাবে সেট করা হয়েছে।"
ব্যবহারকারী 2864740

4
এটি অদ্ভুত, তবে একটি উত্তরাধিকার সূত্রে ওয়েবফোর্সের অ্যাপ্লিকেশনটি Response.IsRequestBeingRedirectedমিথ্যা এবং আমি এখনও এই একই ব্যতিক্রম পাচ্ছি ( Application_EndRequestগ্লোবাল.অ্যাক্সে ইভেন্ট পদ্ধতিটির ভিতরে ) কেন বুঝতে পারছি না।
অ্যালিসন

17

একবার আপনি কোনও ক্লায়েন্টকে কোনও সামগ্রী প্রেরণ করার পরে, HTTP শিরোনাম ইতিমধ্যে প্রেরণ করা হয়েছে। একটি Response.Redirect()কল শিরোনামগুলিতে বিশেষ তথ্য প্রেরণে কাজ করে যা ব্রাউজারকে একটি ভিন্ন ইউআরএল চাইবে।

শিরোনামগুলি ইতিমধ্যে প্রেরণ করা হয়েছে, Asp.net আপনি যা চান তা করতে পারে না (শিরোনাম সংশোধন করুন)

আপনি ক এর মাধ্যমে এটি পেতে পারেন) হয় অন্য কিছু করার আগে পুনঃনির্দেশ করা বা খ) Response.Buffer = trueঅন্য কিছু করার আগে ব্যবহার করার চেষ্টা করুন , নিশ্চিত হয়ে নিন যে পুরো পৃষ্ঠাটি সম্পাদন না হওয়া অবধি ক্লায়েন্টকে কোনও আউটপুট প্রেরণ করা হচ্ছে না।


আমার জন্য এটি কাজ করে না। আমি। নেট, এমভিসি এবং কন্ট্রোলারের পদ্ধতির ভিতরে আমার কল রয়েছে। পুনঃনির্দেশটি ঘটে গেলেও আমি ব্যতিক্রম পাই।
ফ্রেেনকিবি

8

একটি পুনঃনির্দেশ তখনই ঘটতে পারে যখন এইচটিটিপি বার্তার প্রথম লাইন " HTTP/1.x 3xx Redirect Reason" হয়।

যদি আপনি ইতিমধ্যে Response.Write()কিছু শিরোনাম কল করেছেন বা সেট করেছেন তবে পুনঃনির্দেশের জন্য খুব দেরী হবে। Response.Headers.Clear()এটি আপনাকে সাহায্য করে কিনা তা দেখতে আপনি পুনর্নির্দেশের আগে কল করার চেষ্টা করতে পারেন।


আমি ব্যবহার করি return RedirectToAction("Logout", "Authentication");এবং আমি সেই ত্রুটিটি
পেয়েছি

আমি যখন শিরোনামগুলি সাফ করার চেষ্টা করেছি, তখন আমি সিস্টেম পেয়েছি latপ্ল্যাটফর্ম নটসপোর্টড এক্সসেপশন: এই ক্রিয়াকলাপে আইআইএস সংহত পাইপলাইন মোড প্রয়োজন।
আইরিশচাইটেফাইন

3

আপনি বাফারিং বিকল্পটি মিথ্যাতে সেট করেছেন কিনা তা পরীক্ষা করে দেখুন (ডিফল্টরূপে এটি সত্য)। প্রতিক্রিয়া জন্য

  1. বাফারিং সত্য হওয়া উচিত,
  2. আপনার প্রতিক্রিয়া ব্যবহার করে আরও ডেটা প্রেরণ করা উচিত ছিল না w রাইট যা ডিফল্ট বাফার আকারের চেয়ে বেশি (যে ক্ষেত্রে এটি শিরোনামগুলি প্রেরণে নিজেই প্রবাহিত হবে) তাই আপনাকে পুনঃনির্দেশ করতে অস্বীকার করে।

4
Response.BufferOutput = true;কন্ট্রোলারে?
কিকিনেট


2

আপনি নীচে উল্লিখিত কোডও ব্যবহার করতে পারেন

Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();

1

এর জন্য একটি সহজ উত্তর রয়েছে: আপনি শিরোনাম পাঠানোর আগে আপনি অন্য কিছু যেমন পাঠ্য বা আপনার পৃষ্ঠা থেকে আউটপুট সম্পর্কিত কিছু আউটপুট পেয়েছেন। আপনি কেন ত্রুটি পান তা এটি প্রভাবিত করে।

পজিবল আউটপুট জন্য কেবল আপনার কোড পরীক্ষা করুন বা আপনি আপনার পদ্ধতির শীর্ষে শিরোনাম রাখতে পারেন যাতে এটি প্রথমে প্রেরণ হবে।


1

আপনি যদি শিরোনামগুলি প্রেরণের পরে পুনঃনির্দেশের চেষ্টা করছেন (উদাহরণস্বরূপ, আপনি একটি আংশিক উত্পন্ন পৃষ্ঠা থেকে পুনর্নির্দেশের একটি ত্রুটি করছেন), আপনি কিছু ক্লায়েন্ট জাভাস্ক্রিপ্ট (লোকেশন.রেপ্লেস বা লোকেশন.href ইত্যাদি) প্রেরণ করতে পারেন) আপনি চান URL- এ পুনর্নির্দেশ করতে। অবশ্যই, এটি এইচটিএমএল ইতিমধ্যে কি নীচে পাঠানো হয়েছে তার উপর নির্ভর করে।


1

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

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");}

1

আমি ব্যবহার করে সমস্যাটি সমাধান করেছি: রেসপন্স। প্রতিক্রিয়া পরিবর্তে। পুনর্নির্দেশ।


1

HTTP শিরোনাম প্রেরণের পরে ত্রুটি পুনঃনির্দেশ করা যায় না।

System.Web.HttpException (0x80004005): HTTP শিরোনাম প্রেরণের পরে পুনঃনির্দেশ করা যায় না।

পরামর্শ

আমরা যদি এসপ নেটওয়্যার এমভিসি ব্যবহার করি এবং একই নিয়ামক হিসাবে কাজ করি এবং বিভিন্ন ক্রিয়ায় পুনর্নির্দেশ করি তবে আপনার লেখার দরকার নেই ..
রেসপন্স.ডরাইডেক্ট ("অ্যাকশননাম", "কন্ট্রোলারনাম");
কেবল
রিটার্নটোটো অ্যাকশন ("অ্যাকশননাম") ব্যবহার করা ভাল ;
বা
দেখুন ("ভিউনাম") রিটার্ন করুন;


আমি অন্য কন্ট্রোলার নাম থেকে অ্যাকশননেম ব্যবহার করব?
কিকিনেট

0

পুনঃনির্দেশ ফাংশন সম্ভবত 'রিফ্রেশ' HTTP শিরোলেখ ব্যবহার করে (এবং সম্ভবত একটি 30 এক্স কোডও ব্যবহার করে) কাজ করে। একবার শিরোনামগুলি ক্লায়েন্টের কাছে প্রেরিত হয়ে গেলে, সার্ভারের সেই পুনর্নির্দেশ কমান্ড সংযোজন করার উপায় নেই, এটি খুব দেরিতে।


0

আপনি যদি HTTP শিরোনাম প্রেরণের পরে পুনর্নির্দেশ করতে না পারেন তবে নীচের কোডটি চেষ্টা করে দেখুন।

HttpContext.Current.Server.ClearError();
// Response.Headers.Clear();
HttpContext.Current.Response.Redirect("/Home/Login",false);

0

আপনার পুনর্নির্দেশ অংশের আগে আপনি Responseযেমন এর পদ্ধতি ব্যবহার করেন না তা নিশ্চিত হন Response.Flush();


-3

এটি ঠিক করার জন্য 2 টি উপায় রয়েছে:

  1. returnআপনার পরে কেবল একটি বিবৃতি যুক্ত করুন Response.Redirect(someUrl); (যদি পদ্ধতিটির স্বাক্ষরটি "অকার্যকর" না হয়, আপনাকে অবশ্যই "টাইপ" অবশ্যই দিতে হবে) অবশ্যই:

    প্রতিক্রিয়া.প্রশিক্ষণ ("লগইন.এএসপিএক্স");

    প্রত্যাবর্তন

নোট করুন রিটার্নটি সার্ভারকে পুনঃনির্দেশ সম্পাদন করতে দেয় ... এটি ছাড়া সার্ভারটি আপনার বাকী কোডটি চালিয়ে যেতে চায় ...

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