2010-06-21 12 views
7

हम एक बाहर का प्रोसेस सत्र प्रदाता (ScaleOut) ASP.NET अनुप्रयोग के लिए उपयोग कर रहे हैं और हम देखा है कि एक उद्देश्य यह है कि सही ढंग से de-क्रमबद्धता के लिए सेटअप नहीं है अनजाने अपना रास्ता सत्र में बनाता है जब यह अंततः पूरी प्रक्रिया को समाप्त कर देगा।सत्र क्रमबद्धता अपवादों से एप्लिकेशन पूल की रक्षा कैसे करें?

इस परिदृश्य को पुन: उत्पादित करना और संभालना यह है कि यह और भी दिलचस्प हो जाता है।

अपवाद है कि इस प्रक्रिया को समाप्त कर देता AnyStaObjectsInSessionState में उठाया है जिसका कार्यान्वयन बिल्कुल स्पष्ट है:

internal static bool AnyStaObjectsInSessionState(HttpSessionState session) 
{ 
    if (session != null) 
    { 
     int count = session.Count; 
     for (int i = 0; i < count; i++) 
     { 
      object obj2 = session[i]; 
      if (((obj2 != null) && (obj2.GetType().FullName == "System.__ComObject")) 
       && (UnsafeNativeMethods.AspCompatIsApartmentComponent(obj2) != 0)) 
      { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

यहाँ स्टैक ट्रेस पता चलता है कि यहां अपवाद प्रक्रिया समाप्त तरीका देखें:

An unhandled exception occurred and the process was terminated. 

Application ID: /LM/W3SVC/1/ROOT 

Process ID: 4208 

Exception: System.Runtime.Serialization.SerializationException 

Message: The constructor to deserialize an object of type 'Lucene.Net.QueryParsers.ParseException' was not found. 

StackTrace: at System.Runtime.Serialization.ObjectManager.CompleteISerializableObject(Object obj, SerializationInfo info, StreamingContext context) 
    at System.Runtime.Serialization.ObjectManager.FixupSpecialObject(ObjectHolder holder) 
    at System.Runtime.Serialization.ObjectManager.DoFixups() 
    at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) 
    at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) 
    at System.Web.Util.AltSerialization.ReadValueFromStream(BinaryReader reader) 
    at System.Web.SessionState.SessionStateItemCollection.ReadValueFromStreamWithAssert() 
    at System.Web.SessionState.SessionStateItemCollection.DeserializeItem(String name, Boolean check) 
    at System.Web.SessionState.SessionStateItemCollection.DeserializeItem(Int32 index) 
    at System.Web.SessionState.SessionStateItemCollection.get_Item(Int32 index) 
    at System.Web.SessionState.HttpSessionStateContainer.get_Item(Int32 index) 
    at System.Web.Util.AspCompatApplicationStep.AnyStaObjectsInSessionState(HttpSessionState session) 
    at System.Web.HttpApplicationFactory.FireSessionOnEnd(HttpSessionState session, Object eventSource, EventArgs eventArgs) 
    at System.Web.SessionState.SessionOnEndTargetWorkItem.RaiseOnEndCallback() 
    at System.Web.Util.WorkItem.CallCallbackWithAssert(WorkItemCallback callback) 
    at System.Threading.ExecutionContext.runTryCode(Object userData) 
    at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(_ThreadPoolWaitCallback tpWaitCallBack) 
    at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(Object state) 

InnerException: System.Runtime.Serialization.SerializationException 

Message: The constructor to deserialize an object of type 'Lucene.Net.QueryParsers.ParseException' was not found. 

StackTrace: at System.Runtime.Serialization.ObjectManager.GetConstructor(Type t, Type[] ctorParams) 
    at System.Runtime.Serialization.ObjectManager.CompleteISerializableObject(Object obj, SerializationInfo info, StreamingContext context) 

हम दो चीजों को समझना चाहूंगा:

  1. FireSessionOnEnd आउट-ऑफ-प्रोसेस प्रदाता के लिए आग लगती है और, सबसे महत्वपूर्ण बात यह है कि हम इसे विकास के माहौल में कैसे नकल कर सकते हैं जो लोड नहीं हो रहा है? मैंने कम सत्र टाइमआउट (एक मिनट तक सेट) के साथ प्रयोग किया है, मैन्युअल रूप से Abandon() का आविष्कार किया है, और मैन्युअल रूप से GC.Collect() का आविष्कार किया है, सभी का कोई फायदा नहीं हुआ है।

  2. क्या हम ऐप पूल की सुरक्षा के लिए इस चरण में होने वाली त्रुटियों को जाल कर सकते हैं? यहां उठाए गए अपवाद लॉग हैं w/स्रोत = एएसपी.नेट 2.0.50727.0 और global.asax में एप्लिकेशन त्रुटि हैंडलर तक नहीं पहुंचें। उपयुक्त परिदृश्य & सत्र-बाध्य वस्तुओं पर शेष लागू होने के बाद भी, इस परिदृश्य से बचने के लिए हम क्या कर सकते हैं?

किसी भी अंतर्दृष्टि की सराहना की जाएगी।

+1

शायद उन्हें अपने कोड को ठीक करना चाहिए ताकि ऐपडोमेन को क्रैश करने के लिए एक सीरियलाइज़ेशन अपवाद की अनुमति न हो। सिर्फ एक विचार। –

+0

यह एक अच्छा विचार है, और मुझे लगता है कि वे सहमत हैं; यह एक बहुत ही दुर्लभ परिदृश्य है लेकिन फिर भी एक जिसे इसके खिलाफ संरक्षित किया जाना चाहिए। – Nariman

+0

@ जॉन: ऐसा लगता है कि वह Lucene.net का उपयोग कर रहा है। यद्यपि यह एक तृतीय पक्ष ऐप है, एएफएआईके, इसका खुला स्रोत है और उसे अपमानजनक वर्ग 'सीरियलज़ेबल' – ram

उत्तर

3

हम एसओएसएस तकनीकी सहायता की मदद से इस समस्या को हल करने में सक्षम थे - वे काफी मददगार थे - यहाँ हैं विवरण:

  • सत्र समाप्ति पर, एसओएसएस अपने क्लाइंट लाइब्रेरी, जो बारी में (Global.asax में Session_End फायरिंग एनबी के लिए जिम्मेदार हैं के लिए समाप्ति की घटना को जन्म देती है: ग्राहकों को भर में ScaleOut लोड शेष राशि समाप्ति की घटनाओं, इसलिए वेब सर्वर कि सी सत्र को दोबारा शुरू नहीं किया जा सकता है इसकी समाप्ति घटना - इन मुद्दों को पुन: पेश करने की कोशिश करने के लिए यह महत्वपूर्ण है)।
  • क्योंकि यह अनुरोध के संदर्भ के बाहर होता है, अपवाद अनचाहे है और ऐप पूल को मारता है;
  • यह बेहद असामान्य परिदृश्य है लेकिन एक ऐसा है कि वे आगामी रखरखाव रिलीज में संबोधित करेंगे;
  • उपचार इस प्रकार हैं:

    1. System.Exception व्युत्पन्न प्रकार निश्चित करें (कि serializable लेकिन unserializable नहीं है);

    2. Global.asax में Session_End ईवेंट निकालें या अक्षम समाप्ति घटनाओं (max_event_retries soss_params.txt 0 के सेट);

    3. इन स्थितियों में, यह है कि उपयोगकर्ता उनके अनुरोध से एक पर एक SerializationException सामना करना पड़ता है, जिसका अर्थ यह Application_Error तक पहुँच जाता है की संभावना है; यहां आप सत्र कुंजी साफ़ कर सकते हैं ( उन सभी को साफ़ करना होगा) या सत्र को छोड़ दें;

    4. बिना क्रिया अपवादों में से अधिसूचित होने के लिए AppDomain.UnhandledException की सदस्यता लें, वे होने चाहिए (कोई सहारा यहाँ, सिर्फ प्रवेश करने); वे भी हो सकते हैं विरासतउंडलएक्सएक्सप्शन पॉलिसी ( अनुशंसित नहीं);

1

क्या हम ऐप पूल की सुरक्षा के लिए चरण में होने वाली त्रुटियों को जाल कर सकते हैं? यहां उठाए गए अपवाद लॉग हैं w/ स्रोत = एएसपी.नेट 2.0.50727.0 और वैश्विक त्रुटि में अनुप्रयोग त्रुटि हैंडलर तक पहुंचें। इस परिदृश्य के खिलाफ गार्ड पर हम क्या कर सकते हैं, उचित चेक के बाद & शेष सत्र-बाध्य वस्तुओं पर लागू होते हैं?

मैं अगर this काम करेंगे पता नहीं है, लेकिन आप इसे एक शॉट दे सकते हैं

+0

धन्यवाद, लेकिन यह वास्तव में परिदृश्य के खिलाफ सुरक्षा नहीं करता है, यह सिर्फ आपको लॉग इन करने देता है। पुन: पेश करने का एक त्वरित तरीका यहां दिया गया है: http://www.brianlow.com/index.php/2007/01/11/catching-unhandled-aspnet-exceptions/। पृष्ठभूमि धागा * अपवाद पकड़ना चाहिए, या जहाज नीचे चला जाता है। – Nariman

0

मैं बस पूरी तरह से SessionEnd तरीकों निकाल कर इस तय की। विधियों की सामग्री को हटाने के लिए पर्याप्त नहीं है क्योंकि Asp.net प्रतिबिंब का उपयोग करके विधि के अस्तित्व की खोज करता है और फिर अपमानजनक कोड चलाता है।

संबंधित मुद्दे