कोड का अनुकूलन या देशी फ्रेम कॉल स्टैक के शीर्ष पर होने के कारण अभिव्यक्ति का मूल्यांकन करने में असमर्थ


143

मुझे त्रुटि मिल रही है:

कोड का अनुकूलन या देशी फ्रेम कॉल स्टैक के शीर्ष पर होने के कारण अभिव्यक्ति का मूल्यांकन करने में असमर्थ।

मैंने पुनरावर्तक के आइटमकमांड ईवेंट में एक नए पृष्ठ पर पुनः निर्देशित किया है। त्रुटि लाइन में होती है:

string url = "~/Galleries/AlbumImageList.aspx?UId=" + this.UserId.ToString() + "&AlbumId=" + e.CommandArgument.ToString();
Response.Redirect(url);

क्या कोई मेरी मदद कर सकता हैं? क्या वहां कुछ गलत है? _COMPlusExceptionCodeहै - 532459699

जवाबों:


162
Request.Redirect(url,false);

false यह दर्शाता है कि वर्तमान पृष्ठ का निष्पादन समाप्त होना चाहिए या नहीं।


2
क्या ऐसा कुछ अनुरोध है। अप्रत्यक्ष (url, false)?
F11

अनुरोध की कोई पुनर्निर्देशित संपत्ति नहीं है
करण

@Kan जो संस्करण आप अनुरोध के रूप में उपयोग कर रहे हैं, वह "अनुरोध" जैसा होगा
PrateekSaluja

125

नीचे दिखाए अनुसार Response असत्य का दूसरा तर्क दें ।

Response.Redirect(url,false);

67

संकल्प

इस समस्या को हल करने के लिए, निम्न विधियों में से एक का उपयोग करें:

  • के लिए Response.End , फोन HttpContext.Current.ApplicationInstance.CompleteRequest () के बजाय विधि Response.End को कोड निष्पादन बाईपास के लिए Application_EndRequest घटना।

  • के लिए Response.Redirect , एक अधिभार, का उपयोग Response.Redirect (स्ट्रिंग यूआरएल, bool endResponse) कि गुजरता झूठा के लिए endResponse पैरामीटर के लिए आंतरिक कॉल को दबाने के लिए Response.End । उदाहरण के लिए: Response.Redirect ("nextpage.aspx", false);यदि आप इस वर्कअराउंड का उपयोग करते हैं, तो Response.Redirect का अनुसरण करने वाला कोड निष्पादित किया जाता है।

  • के लिए Server.Transfer , का उपयोग Server.Execute बजाय विधि।

लक्षण

यदि आप Response.End, Response.Redirect या Server.Transfer विधि का उपयोग करते हैं, तो एक ThreadAbortException अपवाद उत्पन्न होता है। आप इस अपवाद को पकड़ने के लिए ट्राइ-कैच स्टेटमेंट का उपयोग कर सकते हैं।

कारण

Response.End विधि पृष्ठ के निष्पादन को समाप्त करती है और निष्पादन को अनुप्रयोग के इवेंट पाइपलाइन में Application_EndRequest इवेंट में स्थानांतरित करती है। प्रतिक्रिया का अनुसरण करने वाले कोड की पंक्ति। और निष्पादित नहीं की जाती है।

यह समस्या Response.Redirect और Server.Transfer विधियों में होती है क्योंकि दोनों ही तरीके Response.End को आंतरिक रूप से कहते हैं।

स्थिति

यह बर्ताव डिज़ाइन के चलते है।

गुण

अनुच्छेद आईडी: 312629 - अंतिम समीक्षा: 30 अगस्त, 2012 - संशोधन: 4.0

प्र लागू होता है

  • Microsoft ASP.NET 4.5
  • Microsoft ASP.NET 4
  • Microsoft ASP.NET 3.5
  • Microsoft ASP.NET 2.0
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0

कीवर्ड: kbexcepthandling kbprb KB312629

स्रोत: PRB: ThreadAbortException तब होता है जब आप प्रतिक्रिया का उपयोग करते हैं। और, Response.Redirect, या .Tfer


14

एक बग में मैं जांच कर रहा था कि एक प्रतिक्रिया थी। रीडायरेक्ट () और यह एक अप्रत्याशित स्थान पर चल रहा था ( पढ़ें: अनुचित स्थान - एक सदस्य संपत्ति गेट्टर विधि के अंदर )।

यदि आप किसी समस्या पर बहस कर रहे हैं और " अभिव्यक्ति का मूल्यांकन करने में असमर्थ हैं ... " अपवाद का अनुभव करें:

  1. के लिए एक खोज करें Response.Redirect()और या तो दूसरा पैरामीटर बनाएं एंडरसन = गलत , या
  2. अस्थायी रूप से पुनर्निर्देशित कॉल को अक्षम करें

यह निराशाजनक था क्योंकि यह डिबगर पर "कदम के माध्यम से" से पहले रीडायरेक्ट कॉल निष्पादित करने के लिए दिखाई देगा ।


13

कृपया इस समस्या के पीछे के कारण और त्रुटि के समाधान के लिए इस लिंक की जाँच करें:

http://support.microsoft.com/kb/312629/EN-US/

Microsoft समर्थन आलेख:

PRB: ThreadAbortException तब होता है जब आप Response.End, Response.Redirect, या Server का उपयोग करते हैं।

इस समस्या को हल करने के लिए, निम्न विधियों में से किसी एक का उपयोग करें: Response.End के लिए, HttpContext.Current.ApplicationInstance.CompleteRequest विधि के बजाय Response.End पर कॉल करें और कोड के निष्पादन के लिए Application_EndRequest इवेंट को बायपास करें।

Response.Redirect के लिए, एक अधिभार, Response.Redirect (स्ट्रिंग url, बूल एंडरस्पॉन्स) का उपयोग करें, जो EndResponse पैरामीटर के लिए Response.End को आंतरिक कॉल को दबाने के लिए गलत पास करता है।

उदाहरण के लिए: Response.Redirect ("nextpage.aspx", false);

यदि आप इस वर्कअराउंड का उपयोग करते हैं, तो Response.Redirect का पालन करने वाला कोड निष्पादित किया जाता है। Server.Transfer के लिए, इसके बजाय Server.Execute पद्धति का उपयोग करें।


3

मुझे भी यही समस्या थी, और यह मुश्किल था। मेरे लिए, यह इसलिए था क्योंकि मैं Ext.Js जावास्क्रिप्ट लाइब्रेरी का उपयोग कर रहा हूं। यदि आप एक सर्वर-साइड कोड में एक रिस्पांस कर रहे हैं, जो आपने एक अजाक्स कॉल में एक्सेस किया है , तो समस्याएं हैं। Ext.js में उनके Ext.Redirect विधि के साथ वर्कअराउंड है।


3

इस कोड का उपयोग समस्या को हल करें:

string path = AppDomain.CurrentDomain.BaseDirectory.ToString() + "Uploadfile\\" + fileName;
System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read);
byte[] bt = new byte[fs.Length];
fs.Read(bt, 0, (int)fs.Length);
fs.Close();
Response.ContentType = "application/x-unknown/octet-stream";
Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + fileName;+ "\"");
try
{
    if (bt != null)
    {
        System.IO.MemoryStream stream1 = new System.IO.MemoryStream(bt, true);
        stream1.Write(bt, 0, bt.Length);
        Response.BinaryWrite(bt);
        //Response.OutputStream.Write(bt, 0, (int)stream1.Length);
        Response.Flush();
        // Response.End();
    }
}
catch (Exception ex)
{
    Response.Write(ex.Message);
    throw ex;
}
finally
{
    Response.End();
}

5
यह कोड क्या करता है इसका थोड़ा और स्पष्टीकरण अच्छा होगा।
मोरोववी


2

बस किसी अन्य व्यक्ति को उन मुद्दों में भाग दें जो मैंने किया था मैं Response.End () एक async ट्रिगर बटन का उपयोग कर रहा था

<asp:AsyncPostBackTrigger ControlID="btn_login" />

एक अद्यतन पैनल में। मैं नियमित रूप से सबसे अच्छे पद पर वापस नहीं आया लेकिन यह काम कर गया।

<asp:PostBackTrigger ControlID="btn_login" />. 

चूंकि मैं केवल पृष्ठ पर पुनर्निर्देशित कर रहा था इसलिए यह एक व्यवहार्य समाधान था।


2

यदि आप एक्सेल डाउनलोड करने के लिए अपडेट पैनल और लिंक बटन का उपयोग कर रहे हैं तो पोस्टबैक ट्रिगर जोड़ने की तुलना में पैनल के अंदर है

<asp:PostBackTrigger ControlID="lnkTemplate" /> 

और क्लिक इवेंट के अंदर कोड में

string ServerPath = System.Configuration.ConfigurationManager.AppSettings["FilePath"] + "Template.xlsx";
System.IO.FileInfo file = new System.IO.FileInfo(Server.MapPath(ServerPath));

HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
HttpContext.Current.Response.AddHeader("Content-Length", file.Length.ToString());
            HttpContext.Current.Response.ContentType = "application/octet-stream";
 HttpContext.Current.Response.TransmitFile(file.FullName);
 HttpContext.Current.Response.Flush();
 HttpContext.Current.ApplicationInstance.CompleteRequest();

1

यह प्रयोग करें, मेरे लिए हमेशा काम करता है।

Response.Redirect(Request.RawUrl, false);

यहां, Response.Redirect (Request.RawUrl) को केवल वर्तमान संदर्भ के url पर पुनर्निर्देशित किया जाता है, जबकि दूसरा पैरामीटर "झूठा" या तो एंडरस्पॉन्स को इंगित करता है या नहीं।


1
Stackoverflow में आपका स्वागत है। कृपया अपने उत्तर की व्याख्या करें, यह क्यों काम करता है यह समस्या को कैसे हल करता है, इसलिए अन्य आसानी से समझ सकते हैं।
अष्टकूट

0

यह समस्या तब हो सकती है जब आपके पास किसी मॉडल में एक रेजर पृष्ठ होता है जिसमें कुछ सत्यापन नियम होते हैं। जब आप किसी फ़ॉर्म से पोस्ट करते हैं और आप किसी फ़ील्ड पर सत्यापन त्रुटियों को प्रदर्शित करना भूल जाते हैं, तो यह संदेश आ सकता है। अटकलें: यह तब हो सकता है जब आप जिस पद पर पोस्ट कर रहे हैं वह अलग है और अन्य स्रोतों द्वारा उपयोग किया जाता है या मूल अनुरोध की सेवा करने वाली विधि की तुलना में अलग जगह पर रहता है।

इसलिए क्योंकि यह अलग है, यह त्रुटियों को प्रदर्शित करने या संभालने के लिए मूल पृष्ठ पर वापस नहीं आ सकता है क्योंकि अतिरंजना और मॉडल स्थिति समान नहीं है (ऐसा कुछ)।

यह खोज करना थोड़ा मुश्किल हो सकता है, लेकिन करने में आसान गलती है। सुनिश्चित करें कि आपकी पुनर्विचार विधि वास्तव में इसे पोस्ट करने के सभी संभावित तरीकों को मान्य करती है।

उदाहरण के लिए, यहां तक ​​कि अगर आपके पास सर्वरसाइड मान्यता है जो वास्तव में एक स्ट्रिंग के रूप में लिखना असंभव बना देता है जो आपकी मान्यता से अधिकतम अधिकतम की तुलना में बड़ा है, तो अन्य तरीके और स्रोत हो सकते हैं जो पुनरावर्ती विधि में पोस्ट होते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.