asp.net core - एएसपी.NET कोर एमवीसी में ब्राउज़र एबरटेस्ट पर HttpRequest निरस्त नहीं हुआ(रद्द)



asp.net-core asp.net-core-mvc (1)

यह बताता है कि बस HttpContext.RequestAborted का उपयोग करना वास्तव में सही तरीका है, लेकिन केस्टल में एक बग के कारण (जिस क्रम में एफआईएन / आरएसटी पैकेज संभाला गया था), अनुरोध ब्राउज़र अवरोध पर निरस्त नहीं हुआ था।

बग को अंततः केस्टेल 2.0 में तय किया जाना चाहिए।

अधिक जानकारी के लिए मेरे प्रश्न में अपडेट देखें

रद्द करने की कार्यक्षमता का परीक्षण करने के लिए मैंने निम्न MVC नियंत्रक लिखा है:

class MyController : Controller
{
    [HttpGet("api/CancelTest")]
    async Task<IActionResult> Get()
    {
        await Task.Delay(1000);
        CancellationToken token = HttpContext.RequestAborted;
        bool cancelled = token.IsCancellationRequested;
        logger.LogDebug(cancelled.ToString());
        return Ok();
    }
}

कहो, मैं अनुरोध रद्द करना चाहता हूं, इसलिए मूल्य ' सत्य ' उपरोक्त नियंत्रक कार्रवाई में लॉग इन किया गया है। यदि सर्वर IHttpRequestLifetimeFeature लागू करता है तो यह संभव सर्वर-सा है। सौभाग्य से केस्टल करता है, और इसे निम्नलिखित तरीके से पूरा किया जा सकता है:

var feature = (IHttpRequestLifetimeFeature) HttpContext.Features[typeof(IHttpRequestLifetimeFeature)];
feature.Abort();

समस्या यह है कि मैं ग्राहक पक्ष पर अनुरोध को रद्द करना चाहता हूं। उदाहरण के लिए, ब्राउज़र में ASP.NET MVC / WebApi के पूर्व-कोर संस्करणों में, रद्दीकरण टोकन स्वचालित रूप से रद्द कर दिया जाएगा यदि ब्राउज़र ने एक अनुरोध को रद्द कर दिया है। उदाहरण: क्रोम में पेज को दोबारा ताज़ा करें क्रोम देव टूल के नेटवर्क टैब में आप अब पिछले (अपूर्ण) अनुरोध को रद्द कर सकते हैं।

बात यह है: केएसपीएल पर चलने वाले एएसपी.नेट कोर में, मैं केवल प्रवेश में निम्नलिखित प्रविष्टि देख सकता हूं:

Microsoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: त्रुटि -4081 ECANCELED कार्रवाई रद्द

तो ब्राउज़र से निरस्त अनुरोध को नहीं पहुंचता है और केस्टल वेबसर्वर द्वारा संभाला जाता है। हालांकि यह नियंत्रक में HttpContext के RequestAborted गुण को प्रभावित नहीं करता है, क्योंकि मान ' गलत ' अभी भी विधि द्वारा लॉग किया गया है।

प्रश्न: क्या मेरे नियंत्रक की विधि को रद्द करने / रद्द करने का एक तरीका है, ताकि एचटीटीपीसीटीईएक्स। अनुरोध वाली संपत्ति को रद्द कर दिया जाएगा?

शायद मैं ऐसा कुछ कर सकता हूं जो केस्टल के ऑपरेशन रद्द ट्रिगर की सदस्यता लेंगे और IHttpRequestLifetimeFeature.Abort () विधि को कॉल कर सकता है?

अद्यतन: मैंने कुछ और परीक्षण किया और ऐसा लगता है कि एचटीटीपीएंडेस्ट आईएस वास्तव में निरस्त हो चुकी है, लेकिन रद्दीकरण होने से पहले किसी तरह का देरी लगती है। देरी समयबद्ध नहीं है, और सीधे लिबुव (पुस्तकालय जहां केस्टल वेबसर्वर शीर्ष पर बना है) से सीधे आते हैं। मैंने https://github.com/aspnet/KestrelHttpServer/issues/1103 पर और जानकारी पोस्ट की है

अधिक अद्यतन: समस्या को किसी अन्य पर ले जाया गया है, क्योंकि पिछले एक में एकाधिक समस्याएं हैं https://github.com/aspnet/KestrelHttpServer/issues/1139





kestrel-http-server