রেসপন্স.স্ট্যাটাসকোড সেট করার সময় আইআইএস 7 কাস্টমআররেডগুলিকে ওভাররাইড করে?


98

এখানে একটি অদ্ভুত সমস্যা হচ্ছে। সকলেই জানেন যে আপনি যদি customErrorsকাস্টম ত্রুটি পৃষ্ঠা তৈরি করার জন্য ওয়েবকনফিগের বিভাগটি ব্যবহার করেন তবে Response.StatusCodeযা আপনার উপযুক্ত তা আপনার সেট করা উচিত । উদাহরণস্বরূপ, যদি আমি একটি কাস্টম 404 পৃষ্ঠা তৈরি করি এবং এটি 404.aspx নাম রাখি, তবে আমি এটিতে <% Response.StatusCode = 404 %>সত্যিকারের 404 স্থিতির শিরোনাম তৈরি করতে সামগ্রীতে রেখে দিতে পারি।

এতদূর আমাকে অনুসরণ কর? ভাল. এখন আইআইএস 7 এ করার চেষ্টা করুন। আমি এটি কাজ করতে পারি না, পিরিয়ড। যদি Response.StatusCodeকাস্টম ত্রুটি পৃষ্ঠায় সেট করা থাকে, আইআইএস 7 টি কাস্টম ত্রুটি পৃষ্ঠাটি সম্পূর্ণরূপে ওভাররাইড করে বলে মনে হচ্ছে এবং এর নিজস্ব স্থিতি পৃষ্ঠাটি দেখায় (যদি আপনার একটি কনফিগার করা থাকে তবে)

অন্য কেউ এই আচরণটি দেখেছেন এবং সম্ভবত এটি কীভাবে কাজ করবেন তা জানেন? এটি আইআইএস 6 এর অধীনে কাজ করছিল, তাই কেন জিনিসগুলি পরিবর্তিত হয়েছে তা আমি জানি না।

দ্রষ্টব্য: এটি ASP.NET কাস্টম 404-এ 404 এর পরিবর্তে 200 ঠিক আছে ফিরে পাওয়া যায় না issue


আমিও একই প্রশ্ন করেছিলাম. ইতিমধ্যে এখানে http://stackoverflow.com/questions/347281/asp-net-custom-404- পুনরুদ্ধার-200-ok-instead-of-404-not- found উত্তর দেওয়া হয়েছে ।
ববি ক্যানন

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

আমি মন্তব্য করতে চাই যে ক্লাসিক থেকে ইন্টিগ্রেটেড পাইপাইনে স্যুইচ করার সময় এই সমস্যাটিও ঘটে। আমি @ পাভেলচুচুভা দ্রবণটি ব্যবহার করেছি (@ রিক্সট্রাহল সমাধানটিও কাজ করে)। আমি অনুমান করছি ক্লাসিকের "পাসথ্রু" স্বয়ংক্রিয়, ইন্টিগ্রেটেডে এটি সার্ভারের বিশ্বব্যাপী ত্রুটি পৃষ্ঠা হ্যান্ডলিংয়ে
নেবে

উত্তর:


116

সিস্টেমে বিদ্যমানসেপসনকে পাসথ্রুতে সেট করুন we ওয়েবে সার্ভার / HTTP ত্রুটি বিভাগ:

  <system.webServer>
    <httpErrors existingResponse="PassThrough" />
  </system.webServer>

বিদ্যমান রেসপন্স সম্পত্তিটির ডিফল্ট মান হ'ল অটো:

স্বতঃ সঠিক কাজটি করতে কাস্টম ত্রুটি মডিউলকে বলে । কলটিতে ফিরে আসা fTrySkipCustomErferences এর মানের উপর নির্ভর করে ক্লায়েন্টদের দ্বারা দেখা প্রকৃত ত্রুটি পাঠ্য প্রভাবিত হবে IHttpResponse::GetStatus। যখন fTrySkipCustomErferences সত্য হিসাবে সেট করা থাকে, কাস্টম ত্রুটি মডিউলটি প্রতিক্রিয়াটি অতিক্রম করতে দেয় তবে এটি যদি সেট করা হয় মিথ্যাতে, কাস্টম ত্রুটি মডিউলটি পাঠ্যের পরিবর্তে নিজের পাঠ্যকে প্রতিস্থাপন করে।

আরও তথ্য: আইআইএস custom কাস্টম ত্রুটি মডিউল থেকে কী আশা করা যায়


4
নোট করুন যে বিদ্যমান রিসপন্সকে PassThrough এ সেট করার ফলে কিছু পার্শ্ব প্রতিক্রিয়া হতে পারে। কোনও পরিবর্তন হওয়ার আগে দয়া করে পাভেল প্রদত্ত লিঙ্কটি মাস্টার করুন।
লেেক্স লি

কি <httpErrors existingResponse="PassThrough" />সমতূল্য Response.TrySkipIisCustomErrorsঅথবা তারা ভিন্নভাবে আচরণ করে?
Asbjørn Ulsberg

4
@ sbjornu তারা একই জিনিস অর্জন করেছে তবে আইআইএসের Response.TrySkipIisCustomErrorsকাস্টম ত্রুটিগুলি কখন প্রদর্শিত হবে তা আপনার সাথে আরও ভাল নিয়ন্ত্রণ পেতে পারে।
পাভেল চুচুভা

আপনাকে ধন্যবাদ, আমি প্রতিক্রিয়া.ট্রিস্কিপিসিস্টমাস্টারফায়ার্স সম্পর্কে প্রচুর তথ্য দেখেছি তবে বিদ্যমান প্রতিক্রিয়া সম্পর্কে তেমন কিছু দেখিনি।
এইচবিসিএনডো

আমি কাস্টম ত্রুটিযুক্ত পৃষ্ঠাগুলি IIS7 চলমান আমার ওয়েব হোস্টে বিদ্যমান রেস্পোনস = "অটো" সেট করে কেবলমাত্র কাস্টম ত্রুটিযুক্ত পৃষ্ঠাগুলির সাথে একটি সমস্যার সমাধান করেছি, যা নিবন্ধটি ডিফল্ট হিসাবে দাবি করা দাবী থেকে অত্যন্ত আশ্চর্যজনক ছিল। এটি পরিষ্কারভাবে নয় ... বা আমার হোস্টিং সংস্থা অন্য কোথাও ভুল ডিফল্ট সেট করেছে, আমার ধারণা। যে কোনও উপায়ে আমি আশা করি যে কাউকে কয়েক ঘন্টা বাঁচায়: \
এরিক সাসামান

80

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

Server.ClearError();
Response.TrySkipIisCustomErrors = true;

সাধারণত আপনার অ্যাপ্লিকেশন_অরার হ্যান্ডলারে এটি করা উচিত যা আপনার অ্যাপ্লিকেশন ত্রুটি হ্যান্ডলাররা ধরছে না এমন সমস্ত ত্রুটি পরিচালনা করে।

আরও বিস্তারিত তথ্য এই ব্লগ পোস্টে পাওয়া যাবে: http://www.west-wind.com/weblog/posts/745738.aspx


4
এটি আমার (আইআইএস 8) এর জন্যও কার্যকর হয় না এবং পরামর্শটি ওপির সাথে মেলে না বলে মনে হয় (ধরে নিচ্ছি আমি এটি সঠিকভাবে পড়ছি)। আমি চাইcustomError ট্রিগার Web.config কনফিগার। সঙ্গে Response.TrySkipIisCustomErrors = trueআমি পেতে একই আচরণ: অরুপ সার্ভার দ্বারা তৈরি হওয়া ত্রুটি পৃষ্ঠা প্রদর্শিত হয়। এটি falseকিছুতেই সেট না হয়ে ঘটে - একটি ফাঁকা ব্রাউজার উইন্ডো।
শান দক্ষিণ

আমার জন্য ভাল কাজ! পাভেল চুচুভা তার উত্তরে যে সেটিংয়ের উল্লেখ করেছে সেগুলিও কাজ করেছিল, এর কিছু পার্শ্ব প্রতিক্রিয়া ছিল যা অন্যান্য সমস্যাগুলির কারণ হয়েছিল। এই সেটিংসটি আইআইএস ত্রুটিটি আমি যে নির্দিষ্ট দৃশ্যে চেয়েছিলাম তার ওভাররাইডকে এড়িয়ে চলি, অন্য কিছুর জন্য আচরণ অক্ষত রেখে।
কেভিন টিঘে

আমার জন্য আজুরে ভাল কাজ করেছে। সার্ভার শিরোলেখServer:Microsoft-IIS/8.5 X-AspNet-Version:4.0.30319 X-AspNetMvc-Version:5.2 X-Powered-By:ASP.NET
অক্সফেন

আমি এখনও এটি customErrors mode="Off"কাজ করার জন্য আমার সেট করা দরকার মনে করি । আমি যদি এটি করি তবে আমি এই উত্তরে কোডটি ব্যবহার করি তখন আমার জন্য httpErferences বিদ্যমানResponse = "অটো" (ডিফল্ট) সঠিকভাবে কাজ করে।
অ্যারোনএলএস

11

সমাধান করা: এটি প্রমাণিত হয়েছে যে আইআইএস for এর জন্য আপনার যে কোনও ত্রুটি পৃষ্ঠা "পাস্ত্রথ্রু" করতে "বিস্তৃত ত্রুটিগুলি" চালু থাকা দরকার। Http://forums.iis.net/t/1146653.aspx দেখুন


4
যদিও এটির উত্তর হিসাবে চিহ্নিত করা হয়েছে, আমি মনে করি বিষয়টিতে আরও অন্তর্দৃষ্টি পেতে অন্যান্য উত্তরগুলি পড়ার পক্ষে এটি মূল্যবান।
লেেক্স লি

এছাড়াও এটি অপসারণ করা ভাল হতে পারে। ফিল্টারকনফিগ
পের জি

4

আমি নিশ্চিত নই যে এটি প্রকৃতিতে সাদৃশ্যপূর্ণ কিনা বা না, তবে আমি এমন একটি সমস্যা সমাধান করেছি যা পৃষ্ঠের সমান মনে হয় এবং আমি কীভাবে এটি পরিচালনা করেছি।

প্রথমত, বিদ্যমান রিসপন্সের (অটো) ডিফল্ট মানটি আমার ক্ষেত্রে সঠিক উত্তর ছিল, যেহেতু আমার একটি কাস্টম 404, 400 এবং 500 রয়েছে (আমি অন্যকে তৈরি করতে পারি, তবে এই তিনটিই আমি যা করছি তার জন্য যথেষ্ট হবে)। এখানে প্রাসঙ্গিক বিভাগগুলি আমাকে সহায়তা করেছিল।

ওয়েবকনফিগ থেকে:

<customErrors mode="Off" />

এবং

<httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL">
  <clear />
  <error statusCode="404" path="/errors/404.aspx" responseMode="ExecuteURL" />
  <error statusCode="500" path="/errors/500.aspx" responseMode="ExecuteURL" />
  <error statusCode="400" path="/errors/400.aspx" responseMode="ExecuteURL" />
</httpErrors>

সেখান থেকে, আমি এটিকে Global.asax এর অ্যাপ্লিকেশন_এররে যুক্ত করেছি:

    Response.TrySkipIisCustomErrors = True

আমার প্রতিটি কাস্টম ত্রুটি পৃষ্ঠায় আমাকে সঠিক প্রতিক্রিয়া স্থিতি কোডটি অন্তর্ভুক্ত করতে হয়েছিল। আমার ক্ষেত্রে, আমি আমার সাইটের বিভিন্ন বিভাগে ব্যবহারকারীদের প্রেরণের জন্য একটি কাস্টম 404 ব্যবহার করছি, সুতরাং আমি 404 স্থিতির কোডটি চাই না যদি না এটি আসলে একটি মৃত পৃষ্ঠা না হয়।

যাইহোক, আমি এটি এটিই করেছিলাম। আশা করি যে কাউকে সাহায্য করবে


3

এই সমস্যাটি একটি প্রধান মাথাব্যথা হয়ে দাঁড়িয়েছে। পূর্বে উল্লিখিত পরামর্শগুলির মধ্যে একটিও আমার পক্ষে এটি সমাধান করেনি, তাই আমি আমার সমাধানটি অন্তর্ভুক্ত করছি। রেকর্ডের জন্য, আমাদের পরিবেশ / প্ল্যাটফর্ম ব্যবহার করে:

  • .NET ফ্রেমওয়ার্ক 4
  • এমভিসি 3
  • আইআইএস 8 (ওয়ার্কস্টেশন) এবং আইআইএস 7 (ওয়েব সার্ভার)

বিশেষত, আমি একটি এইচটিটিপি 404 প্রতিক্রিয়া পাওয়ার চেষ্টা করছিলাম যা ব্যবহারকারীকে আমাদের কাস্টম 404 পৃষ্ঠায় (ওয়েবকনফিগ সেটিংসের মাধ্যমে) পুনর্নির্দেশ করবে।

প্রথমত, আমার কোডটি একটি নিক্ষেপ করতে হয়েছিল HttpExceptionNotFoundResultকন্ট্রোলারের কাছ থেকে ফেরত দেওয়া ফলাফল আমি পরে পাইনি।

throw new HttpException(404, "There is no class with that subject");

তারপর আমি কনফিগার করতে ছিল উভয়customErrors এবং httpErrorWeb.config বিভিন্ন নোডের।

<customErrors mode="On" defaultRedirect="/classes/Error.aspx">
  <error statusCode="404" redirect="/classes/404.html" />
</customErrors>

...

<httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL">
  <clear />
  <error statusCode="404" path="/classes/404.aspx" responseMode="ExecuteURL" />
</httpErrors>

নোট করুন যে আমি existingResponseযেমনটি রেখেছি Auto, যা @ এসএফএল প্রদত্ত সমাধানের চেয়ে আলাদা।

customErrorsসেটিংস হ্যান্ডলিং আমার স্পষ্টভাবে নিক্ষিপ্ত করার প্রয়োজন হতে দেখা HttpException, যখন httpErrorsনোড যে URL গুলি Globals.asax.cs উল্লেখিত রুট প্যাটার্নের বাইরে পড়ে ঘাঁটা।

PS এই সেটিংগুলির সাথে আমার সেট করার দরকার নেই Response.TrySkipIisCustomErrors


2

TrySkipIisCustomErrorsধাঁধা একটি অংশ। আপনি যদি কাস্টম ত্রুটি পৃষ্ঠাগুলি ব্যবহার করেন তবে আপনি 4XX স্থিতির উপর ভিত্তি করে কিছু RESTful সামগ্রী সরবরাহ করতে চান তবে আপনার সমস্যা আছে। ওয়েবকনফাইগের httpErferences.existingResponse কে "অটো" তে সেট করা কাজ করে না, কারণ .NET সবসময় কিছু পৃষ্ঠার সামগ্রী আইআইএসে সরবরাহ করে বলে মনে হয়, সুতরাং "অটো" ব্যবহার করে সমস্ত (বা কমপক্ষে কিছু) কাস্টম ত্রুটি পৃষ্ঠা ব্যবহার না করা হবে। "প্রতিস্থাপন" ব্যবহার করা খুব বেশি কাজ করবে না, কারণ প্রতিক্রিয়াতে আপনার HTTP স্থিতি কোড থাকবে তবে এর সামগ্রীটি খালি বা কাস্টম ত্রুটি পৃষ্ঠাতে ভরাট হবে। এবং "পাসথ্রু" আসলে সিইপি বন্ধ করে দেয়, তাই এটি ব্যবহার করা যায় না।

সুতরাং আপনি যদি কিছু ক্ষেত্রে সিইপিকে বাইপাস করতে চান (কিছুটা বিষয়বস্তু দিয়ে স্টেটাস 4XX ফিরিয়ে দেওয়ার অর্থ বাইপাস করে) আপনার অতিরিক্ত পদক্ষেপের প্রয়োজন হবে: ত্রুটিটি পরিষ্কার করুন:

void Application_Error(object sender, EventArgs e)
{
    var httpException = Context.Server.GetLastError() as HttpException;
    var statusCode = httpException != null ? httpException.GetHttpCode() : (int)HttpStatusCode.InternalServerError;

    Context.Server.ClearError();
    Context.Response.StatusCode = statusCode;
}

সুতরাং আপনি যদি REST প্রতিক্রিয়া (যেমন 400 - খারাপ অনুরোধ) ব্যবহার করতে চান এবং এর সাথে কিছু সামগ্রী প্রেরণ করতে চান তবে আপনাকে কেবল TrySkipIisCustomErrorsকোনও পদক্ষেপে সেট existingResponseকরতে হবে এবং ওয়েবকনফাইগের httpErferences বিভাগে "অটো" সেট করতে হবে। এখন:

  • যখন কোনও ত্রুটি নেই (ক্রিয়া 4XX বা 5XX ফেরত দেয়) এবং কিছু সামগ্রী ফিরে আসে তখন সিইপি ব্যবহার করা হয় না এবং সামগ্রীটি ক্লায়েন্টকে দেওয়া হয়;
  • যখন ত্রুটি থাকে (ব্যতিক্রম ছুঁড়ে দেওয়া হয়) ত্রুটি হ্যান্ডলারের দ্বারা ফিরে আসা সামগ্রী সরানো হয়, তাই সিইপি ব্যবহার করা হয়।

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


0

ডিফল্টরূপে আইআইএস 7 বিস্তারিত কাস্টম ত্রুটি বার্তা ব্যবহার করে তাই আমি ধরে নেব যে রেসপন্স.স্ট্যাটাসকোড কেবল 404 এর চেয়ে 404.XX এর সমান হবে।

আপনি সরল ত্রুটি বার্তা কোডগুলি ব্যবহার করতে আইআইএস 7 টি কনফিগার করতে পারেন বা আইআইএস 7 প্রস্তাবিত আরও ত্রুটি বার্তাগুলি পরিচালনা করে আপনার কোডটি সংশোধন করতে পারেন।

এখানে আরও তথ্য উপলব্ধ: http://blogs.iis.net/rakkimk/archive/2008/10/03/iis7-enabling-custom-error-pages.aspx

আরও তদন্তে আমার জানা গেল যে আমার কাছে এটি ভুল উপায়ে ছিল - বিস্তারিত বার্তা ডিফল্টরূপে হয় না তবে সম্ভবত আপনি যদি উল্লেখ করেছেন এমন ভিন্ন ভিন্ন ত্রুটি বার্তা আপনার বাক্সে চালু করা হয়েছে they


রেসপন্স.স্ট্যাটাসকোড একটি পূর্ণসংখ্যা, সুতরাং আমি কেবল "404" এর চেয়ে বেশি নির্দিষ্ট কোড সেট করার কোনও উপায় দেখতে পাচ্ছি না। আপনার ইউআরএল ইঙ্গিত দেয় এমন কাস্টম ত্রুটি পৃষ্ঠা ব্যবহার / প্রদর্শন করার জন্য আমি আইআইএস 7 কনফিগার করেছি।
নিকোলাস

হুমম ... দুর্ভাগ্যক্রমে আমি এই মুহুর্তে পরীক্ষা করতে পারছি না কারণ আমি আমার বাড়ির পিসিতে নেই। ততক্ষণে যদি আপনার কোনও সমাধান না হয় - আমার আজকের রাত্রে চেহারা হবে।
nullnvoid
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.