हम एक बाहर का प्रोसेस सत्र प्रदाता (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)
हम दो चीजों को समझना चाहूंगा:
FireSessionOnEnd आउट-ऑफ-प्रोसेस प्रदाता के लिए आग लगती है और, सबसे महत्वपूर्ण बात यह है कि हम इसे विकास के माहौल में कैसे नकल कर सकते हैं जो लोड नहीं हो रहा है? मैंने कम सत्र टाइमआउट (एक मिनट तक सेट) के साथ प्रयोग किया है, मैन्युअल रूप से Abandon() का आविष्कार किया है, और मैन्युअल रूप से GC.Collect() का आविष्कार किया है, सभी का कोई फायदा नहीं हुआ है।
क्या हम ऐप पूल की सुरक्षा के लिए इस चरण में होने वाली त्रुटियों को जाल कर सकते हैं? यहां उठाए गए अपवाद लॉग हैं w/स्रोत = एएसपी.नेट 2.0.50727.0 और global.asax में एप्लिकेशन त्रुटि हैंडलर तक नहीं पहुंचें। उपयुक्त परिदृश्य & सत्र-बाध्य वस्तुओं पर शेष लागू होने के बाद भी, इस परिदृश्य से बचने के लिए हम क्या कर सकते हैं?
किसी भी अंतर्दृष्टि की सराहना की जाएगी।
शायद उन्हें अपने कोड को ठीक करना चाहिए ताकि ऐपडोमेन को क्रैश करने के लिए एक सीरियलाइज़ेशन अपवाद की अनुमति न हो। सिर्फ एक विचार। –
यह एक अच्छा विचार है, और मुझे लगता है कि वे सहमत हैं; यह एक बहुत ही दुर्लभ परिदृश्य है लेकिन फिर भी एक जिसे इसके खिलाफ संरक्षित किया जाना चाहिए। – Nariman
@ जॉन: ऐसा लगता है कि वह Lucene.net का उपयोग कर रहा है। यद्यपि यह एक तृतीय पक्ष ऐप है, एएफएआईके, इसका खुला स्रोत है और उसे अपमानजनक वर्ग 'सीरियलज़ेबल' – ram