मुझे एक डॉटनेट रेज़र पेज वेब ऐप में UseStatusCodePagesWithReExecute के साथ समस्या हो रही है, जबकि पेज अनुरोधों के लिए एक कस्टम 404 त्रुटि पृष्ठ दिखाने का प्रयास करते हुए जो एक NotFound परिणाम लौटाता है। विशेष रूप से, यदि मैं ऑनगेट विधि से नॉटफाउंड लौटाता हूं तो मुझे लगता है कि वही अनुरोध फिर से कहा जाता है और मिडलवेयर को दिए गए पथ का पुन: निष्पादन कभी नहीं होता है।

मैं .NET Core 3.0 का उपयोग कर रहा हूं इसलिए पिछले संस्करणों, या 3.1 पूर्वावलोकन के साथ प्रयास नहीं किया है।

मैं एक साधारण रेपो के साथ समस्या को दोहराने में कामयाब रहा हूं। निम्नलिखित एक अमान्य मार्ग को त्रुटि पृष्ठ पर पुनर्निर्देशित करने की अनुमति देगा (जैसे https://localhost:5001/foo), हालांकि, मार्ग https://localhost:5001/ को दो बार कॉल किया जाएगा और त्रुटि पृष्ठ पर पुनर्निर्देशित नहीं किया जाएगा।

तो मैं जो सवाल पूछ रहा हूं, क्या यह एक बग है या क्या मुझे यहां कुछ अवधारणा याद आ रही है? मैंने संबंधित UseStatusCodePagesWithRedirects विधि की कोशिश की है और यह वही करता है जो यह कहता है कि इसे करना चाहिए लेकिन अगर मैं कर सकता हूं तो मैं वास्तव में ReExecute का उपयोग करना चाहता हूं।

Juga, saya akan merekomendasikan Anda menggunakan jalur relatif ke file javascript alih-alih jalur absolut.

वातावरण:

  • विंडोज 10
  • डॉटनेट कोर 3.0
  • क्रोम और एज ब्राउज़र (दूसरों की कोशिश नहीं की) - ऐसा मत सोचो कि यह एक ब्राउज़र समस्या है, वैसे भी कोई पुन: प्रस्तुत नहीं है।

कदम:

  1. टेम्पलेट रेज़र प्रोजेक्ट बनाएं dotnet new webapp -n myapp
  2. निम्नलिखित होने के लिए Index.cshtml.cs OnGet विधि संपादित करें:
        public IActionResult OnGet()
        {
            return NotFound();
        }
  1. Startup.cs संपादित करें और app.UseStatusCodePagesWithReExecute("/Error"); को कॉन्फिगर विधि में if/else कोड ब्लॉक के ठीक बाद जोड़ें, जैसे:
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            // Added this line
            app.UseStatusCodePagesWithReExecute("/Error");

            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();
            });
        }
  1. पहली पंक्ति में ऑनगेट में एक ब्रेकपॉइंट (वीएसकोड या विजुअल स्टूडियो 2019 मानकर) रखें।
  2. अनुक्रमणिका पृष्ठ पर पहले अनुरोध के बाद डीबग और F5 चलाएँ। /Error पर रीडायरेक्ट नहीं होता है और इसके बजाय ब्रेकपॉइंट फिर से हिट होता है।
  3. फिर से F5 दबाएं और ब्राउज़र फिर त्रुटि पृष्ठ के बजाय अपना मानक 404 दिखाता है।

अग्रिम में धन्यवाद।

1
Mark 2 पद 2019, 19:32

2 जवाब

सबसे बढ़िया उत्तर

StatusCodePages मिडलवेयर में कस्टम त्रुटि पृष्ठ दिखाने के लिए 3 तरीके हैं, वे हैं UseStatusCodePages, UseStatusCodePagesWithReditects और UseStatusCodePagesWithReExecute। जब भी आप https://localhost:5001/ पर जाएं, तो आप एक NotFound परिणाम वापस करना चाहते हैं Index.cshtml.cs OnGet विधि, आपको UseStatusCodePagesWithReExecute के बजाय अपने 404 त्रुटि पृष्ठ को अनुकूलित करने के लिए UseStatusCodePages का उपयोग करना चाहिए।

फिर भी, यदि आप UseStatusCodePagesWithReExecute का उपयोग करना जारी रखते हैं, तो आपको वास्तविक NotFound वापस करने की आवश्यकता नहीं है। UseStatusCodePagesWithReExecute गैर-मौजूदा संसाधनों के लिए है। एक बार जब आप https://localhost:5001/any-non-exisisting-page पर जाते हैं , यह 404 फेंक देगा और फिर आपके स्वयं के त्रुटि पृष्ठ के लिए अनुरोध को फिर से निष्पादित करेगा। लेकिन यह NotFound पद्धति का प्रतिस्थापन नहीं है। साथ ही, UseStatusCodePagesWithReExecute का उपयोग करते समय कुछ शर्तों और प्रतिबंधों पर ध्यान दें, आप इस लेख को देख सकते हैं: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/error-handling?view=aspnetcore-3.1

यहां एक कामकाजी नमूना है।

  1. Startup.cs कॉन्फ़िगर विधि संपादित करें, जैसे:

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
        //app.UseDeveloperExceptionPage();
        }
        else
        {
       // app.UseExceptionHandler("/Error");
        // The default HSTS value is 30 days. You may want to change this for 
        production scenarios, see https://aka.ms/aspnetcore-hsts.
       // app.UseHsts();
        }
    
       //app.UseStatusCodePages();
        app.UseStatusCodePagesWithReExecute("/Error", "?code={0}");
       // app.UseHttpsRedirection();
    
        app.UseStaticFiles();
    
        //app.UseStatusCodePagesWithRedirects("/Error");
    
        app.UseRouting();
    
        app.UseAuthorization();
    
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    
    }
    
  2. Error.cshtml में @page "{code?}" जोड़ें:

@page "{code?}"
@model ErrorModel
@{
    ViewData["Title"] = "Error";
}

<h1 class="text-danger">Error.</h1>
<h1 class="text-danger">Status Code: @Model.ErrorStatusCode</h1>

<h2 class="text-danger">An error occurred while processing your request.</h2>

@if (Model.ShowRequestId)
{
    <p>
        <strong>Request ID:</strong> <code>@Model.RequestId</code>
    </p>
}

<h3>Development Mode</h3>
<p>
    Swapping to the <strong>Development</strong> environment displays detailed information about the error that occurred.
</p>
<p>
    <strong>The Development environment shouldn't be enabled for deployed applications.</strong>
    It can result in displaying sensitive information from exceptions to end users.
    For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
    and restarting the app.
</p>
  1. जब https://localhost:52602/hhh पर जाएं, जो कि एज में एक गैर-मौजूदा पेज है, ब्राउज़र दिखाता है यह पन्ना:

enter image description here

2
DevPreSupport_MSFT 10 पद 2019, 09:48

यदि तुम प्रयोग करते हो

return new NotFoundResult();

की बजाय

return NotFound();

यह वांछित पाइपलाइन का उपयोग करेगा, केवल नकारात्मक पक्ष यह है कि संदेश पास करने का कोई तरीका नहीं है, यदि आप एक संदेश पास करना चाहते हैं, तो आपको उस स्थिति को संभालने के लिए अपना खुद का मिडलवेयर बनाने की आवश्यकता है।

0
Mike 1 अप्रैल 2021, 22:17