Startup.cs में मेरे पास एक अत्यंत सरल मानचित्र है

app.Map("/Home",x=>x.UseMiddlewareLogic1() );

मेरा कॉन्फ़िगरेशन का पूरा कोड नीचे दिखाया गया दिखता है

public void Configure(IApplicationBuilder app)
        {
            app.Map("/Home",x=>x.UseMiddlewareLogic1() );
            //app.UseMiddlewareLogic1();
            //app.UseMiddlewareLogic2();
            app.Run(async context =>
             Logic3(context));
        }

तर्क 3 केवल एक प्रतिक्रिया लेखन है जैसा कि नीचे दिखाया गया है

 public async Task Logic3(HttpContext obj)
        {
            await obj.Response.WriteAsync("Logic 3\n");

        }

उपरोक्त कोड 404 नहीं मिला दिखाता है। मिडलवेयर लॉजिक क्लास मानक वर्ग है जो विजुअल स्टूडियो टेम्पलेट में आता है। मैं वीएस 2017 का उपयोग कर रहा हूं।

 public class MiddlewareLogic1
    {
        private readonly RequestDelegate _next;

        public MiddlewareLogic1(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext httpContext)
        {
            await httpContext.Response.WriteAsync("This is logic123 \n");
            await _next(httpContext);
        }
    }

    // Extension method used to add the middleware to the HTTP request pipeline.
    public static class MiddlewareLogic1Extensions
    {
        public static IApplicationBuilder UseMiddlewareLogic1(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<MiddlewareLogic1>();
        }

    }
3
Shivprasad Koirala 29 सितंबर 2017, 07:34
क्या आपकी Configure पद्धति में कुछ और है? विशेष रूप से, app.Map(...) के बाद?
 – 
BFree
29 सितंबर 2017, 07:45
हाँ मेरे पास app.run (इसके लिए अद्यतन कोड) है जहाँ मैं प्रतिक्रिया के लिए अंतिम आउटपुट लिख रहा हूँ।
 – 
Shivprasad Koirala
29 सितंबर 2017, 07:49

1 उत्तर

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

यह आपकी समस्या है: app.Map("/Home",x=>x.UseMiddlewareLogic1() );

यदि आप app.Map का उपयोग कर रहे हैं, तो फ्रेमवर्क Map शाखा के बाहर मिडलवेयर निष्पादित नहीं करेगा (जो app.Map के बाद पंजीकृत हैं - मिडलवेयर का क्रम महत्वपूर्ण है)। इसके बजाय, यह स्वचालित रूप से इसे समाप्त कर देगा। दूसरे शब्दों में, पाइपलाइन को समाप्त करने के लिए आपको कभी भी .Run के अंदर .Map का उपयोग करने की आवश्यकता नहीं है।

और आपको 404 मिलते हैं क्योंकि MiddlewareLogic1 Map में इस्तेमाल होने वाले मिडलवेयर में await _next(httpContext); है, लेकिन इस Map शाखा में कोई अन्य पाइपलाइन पंजीकृत नहीं है। यदि आप await _next(httpContext); को हटाते हैं, तो आप 404 के बजाय प्रत्युत्तर "This is logic123 में देखेंगे।


अपडेट करें: .Map और .MapThen दोनों का समाप्ति व्यवहार समान है। एक समाधान के रूप में, आप इस पर विचार कर सकते हैं - .Map को .Use से बदलें और आंतरिक रूप से लॉगिन की तुलना करने के लिए क्वेरी करें। - या .app.Map में मिडलवेयर की एक अलग श्रृंखला पंजीकृत करें।

1
Shivprasad Koirala 30 सितंबर 2017, 07:13
उपरोक्त लेख बहुत ही बुनियादी लगते हैं। यह मेरे प्रश्न का उत्तर नहीं देता है। जब मैं इस ऐप को डालता हूं। मैपव्हेन (संदर्भ => संदर्भ। Request.QueryString.Value.StartsWith ("/ home123"), x => x.UseMiddlewareLogic1 ()); केवल Logic3 निष्पादित करता है।
 – 
Shivprasad Koirala
29 सितंबर 2017, 09:34
लेकिन हां, मैं समझ सकता हूं कि मिडलवेयर मानक कोड साधारण परिदृश्यों के लिए बनाया गया है, इसलिए इसके लिए काम नहीं करेगा। मुझे इसमें संशोधन करना होगा।
 – 
Shivprasad Koirala
29 सितंबर 2017, 09:39
हां उन दोनों का व्यवहार समाप्त हो रहा है। क्या आप अपना उत्तर अपडेट कर सकते हैं मैं इसे धन्यवाद दूंगा।
 – 
Shivprasad Koirala
29 सितंबर 2017, 10:55
मुझसे +1। समान समाप्ति व्यवहार वाले .Map, MapThen (और MapHow) के बारे में टिप ने मेरी समस्या का समाधान किया। सशर्त जांच को ऐप के साथ पाइपलाइन में सबसे अच्छा अंतःक्षिप्त किया जाता है। जब कौन सी शाखाएं और मुख्य अनुरोध पाइपलाइन में वापस जुड़ती हैं।
 – 
RizJa
22 नवम्बर 2019, 22:21