2010-06-25 13 views
7

में कॉलकॉन्टेक्स्ट डब्ल्यूसीएफ सेवा के अनुरोध पर कॉलकॉन्टेक्स्ट का उपयोग करना सुरक्षित है, इसे कुछ कॉल विशिष्ट डेटा (उदाहरण के लिए कॉल की शुरुआत में हुक का उपयोग करके: इंस्पेक्टर/कॉन्टेक्स्टबाउंडऑब्जेक्ट) के साथ शुरू करें, और फिर इसे कॉल में पुन: उपयोग करें, और गारंटी दी जा सकती है कि मैं जिस डेटा का उपयोग करता हूं वह हर समय एक ही डेटा है?डब्ल्यूसीएफ

धन्यवाद, पावेल

उत्तर

7

आप निरीक्षकों से इसे का उपयोग नहीं कर रहे हैं तो यह सुरक्षित होना चाहिए, लेकिन अगर आप दूरस्थ उपयोग नहीं कर रहे हैं या एक AppDomain सीमा को पार तो यह शायद आसान है सिर्फ एक धागा स्थिर क्षेत्र का उपयोग करने के । एक स्थिर क्षेत्र पर ThreadStaticAttribute डालें और यह प्रत्येक थ्रेड में एक अलग संग्रहण स्थान होगा।

यदि आप IDispatchMessageInspector में मान सेट करने का प्रयास कर रहे हैं, तो यह काम नहीं करेगा क्योंकि वे अनुरोध से अलग थ्रेड में भाग लेंगे। OperationContext पर एक नज़र डालें, जो डब्ल्यूसीएफ अनुरोध के बारे में कॉल-विशिष्ट जानकारी प्रदान करेगा। आप इसमें एक्सटेंशन जोड़ सकते हैं जो IExtension<OperationContext> को लागू करके और उन्हें एक्सटेंशन संपत्ति में जोड़कर कस्टम डेटा स्टोर कर सकते हैं। Here is a blog post जो वर्णन करता है कि ऑपरेशन कॉन्टेक्स्ट में कस्टम डेटा कैसे जोड़ें।

+0

धन्यवाद। मैंने कुछ समय पहले AOP और ContextBoundObject का उपयोग करके अपना समाधान तैयार किया है। मैंने पहलू वर्ग विधि में अपना ऑपरेशन-स्कोप गुण सेट किया है SyncProcessMessage: CallContext.SetData ("वर्कस्पेस प्रबंधक", _workspaceManager); यह तब सुरक्षित होना चाहिए? – dragonfly

+1

एक और चीज जो मुझे परेशान करती है ... एएसपीनेट वेब एप्लिकेशन में यह कहा गया है कि एक अनुरोध एक से अधिक धागे (कुछ थ्रेड स्विचिंग जैसे) का उपयोग कर सर्वर हो सकता है। यह डब्ल्यूसीएफ मेजबान पर्यावरण में समान नहीं है? जब ऑपरेशन संसाधित हो जाता है तो क्या वह किसी भी बिंदु को निलंबित कर सकता है, और फिर किसी अन्य धागे का उपयोग करके फिर से शुरू किया जा सकता है? – dragonfly

+3

जिस एप्लिकेशन पर मैं काम करता हूं उसमें विरासत कोड डब्ल्यूसीएफ ऑपरेशन के भीतर कॉलकॉन्टेक्स्ट में उपयोगकर्ता-विशिष्ट स्थिति संग्रहीत कर रहा था। चूंकि हमारी डब्ल्यूसीएफ सेवाओं को आईआईएस में होस्ट किया जाता है, इसलिए विभिन्न डब्ल्यूसीएफ ऑपरेशंस विभिन्न धागे पर चलते हैं, जिन्हें आईआईएस थ्रेड पूल से पुन: उपयोग किया जाता है। हम कुछ स्पोरैडिक व्यवहार को देख रहे थे जहां कुछ ऑपरेशन अन्य उपयोगकर्ताओं से संबंधित उपयोगकर्ता डेटा उठा रहे थे। ऑपरेशन कॉन्टेक्स्ट की बजाय, कॉलकॉन्टेक्स्ट का उपयोग करके गलत तरीके से कोड के कारण, जो केवल डब्ल्यूसीएफ ऑपरेशन के जीवनकाल के लिए मान्य है। यह ट्रैक करना मुश्किल था, लेकिन ऑपरेशन कॉन्टेक्स्ट में बदलकर इसे हल किया गया। – ozziepeeps