2010-11-10 9 views
7

मैंने कॉल संदर्भ (CallContext.SetData(key,data)) पर कुछ डेटा रखा है, जहां डेटा ILogicalThreadAffinative लागू करता है। यह कारण है कि यह ILogicalTreadAffinative लागू करता है यह है कि इसे वर्तमान अनुप्रयोग में एकाधिक धागे में साझा किया जाना चाहिए।लॉजिकल कॉल संदर्भ के दायरे को सीमित करने के लिए कैसे करें

हालांकि, एप्लिकेशन किसी अन्य सेवा पर रिमोट कॉल भी करता है, और यही वह जगह है जहां समस्या आती है। मेरा अनौपचारिक थ्रेडअफिनेटिव कार्यान्वयन क्रमबद्ध नहीं है और यह नहीं होना चाहिए। यहां तक ​​कि अगर मैं इसे क्रमबद्ध करने के लिए चिह्नित करता हूं, तो रिमोट एप्लिकेशन को असेंबली तक पहुंच नहीं होती है जिसमें टाइप घोषित किया जाता है, इसलिए यह इसे deserialize करने में सक्षम नहीं होगा।

तो मैं अपने आवेदन (ऐपडोमेन) के भीतर कॉल संदर्भ डेटा कैसे साझा करूं लेकिन हर बाहरी एप्लिकेशन के साथ बात करने की आवश्यकता नहीं होती है?

उत्तर

6

आखिरकार मैंने कस्टम इमेजेज सिंक को लागू करके इसे हल किया जिसे मैंने रिमोटिंग कॉल के क्लाइंट साइड पर फॉर्मेटर सिंक से पहले डाला था। सिंक तार संदर्भ डेटा को तार भरने से पहले बाहर निकाल देता है। नीचे प्रासंगिक विधि है।

private static void SanitizeCallContext(IMessage msg) 
    { 
     var callContext = msg.Properties["__CallContext"] as LogicalCallContext; 

     if (callContext == null) return; 

     var sanitizedContext = (LogicalCallContext) callContext.Clone(); 
     var prop = typeof (LogicalCallContext).GetProperty("Datastore", 
                  BindingFlags.Instance | BindingFlags.NonPublic); 
     var dataStore = (Hashtable) prop.GetValue(sanitizedContext, null); 
     foreach (var key in dataStore.Keys.Cast<string>().ToArray()) 
      sanitizedContext.FreeNamedDataSlot(key); 

     msg.Properties["__CallContext"] = sanitizedContext; 
    } 

मुझे विशेष रूप से इस समाधान को पसंद नहीं है। यह थोड़ा हैकिश से अधिक लगता है, लेकिन यह सबसे अच्छा समाधान है जिसके साथ मैं आने में सक्षम हूं।

+0

मुझे पता है कि आपने अपनी समस्या का समाधान निकाला है, लेकिन मुझे हाल ही में जेकरी रिचटर की पुस्तक से एक्सेक्यूशन कॉन्टेक्स्ट का उपयोग करने के बारे में यह अंश मिला है। सप्रेसप्रेस लॉजिकल थ्रेड डेटा के प्रवाह को दबाने के लिए । मुझे नहीं पता कि यह आपके द्वारा वर्णित मामले में काम करेगा, लेकिन, यदि ऐसा होता है, तो यह अंततः आपके द्वारा किए गए कार्यों की तुलना में क्लीनर हो सकता है: http://blogs.msdn.com/b/microsoft_press/archive/2010 /01/27/jeffrey-richter-excerpt-from-clr-via-c-third-edition.aspx – wageoghe

+0

वागाघे, जो वैकल्पिक समाधान के रूप में आशाजनक दिखता है। मैं यह सुनिश्चित करने के लिए एक रिमोटिंग परिदृश्य में इसका परीक्षण करना चाहता हूं। इसका नुकसान यह है कि इसे कॉलिंग कोड के अंदर प्रति कॉल आधार पर स्थापित किया जाना चाहिए।उपरोक्त समाधान अधिक पहलू उन्मुख है और कुछ तरीकों से क्लीनर है। –

3

मेरी समझ, जो गलत हो सकती है, यह है कि कॉलकॉन्टेक्स्ट में डेटा डालने के लिए यह कई धागे में बहने के लिए पर्याप्त है। ILogicalTreadAffinative (या LogicalSetData के माध्यम से CallContext में डेटा डालने) को कार्यान्वित करना केवल तभी जरूरी है जब आप इसे AppDomains में "स्वचालित रूप से" प्रवाह करना चाहते हैं। तो ऐसा लगता है कि यदि आप अपने डेटा को कॉलकॉन्टेक्स्ट में डालते हैं लेकिन ILogicalTreadAffinative को लागू नहीं करते हैं तो आपको वह करना चाहिए जो आप चाहते हैं (आपके आवेदन के भीतर प्रवाह करें लेकिन ऐपडोमेन में नहीं)?

http://social.msdn.microsoft.com/forums/en-US/netfxremoting/thread/aec8dda5-102e-44eb-9a41-0a5d8b8b96e9

एक और लिंक जाहिरा तौर पर ऊपर के लिंक से जानकारी का संदर्भ देता है: http://dotnetmustard.blogspot.com/2008/08/identifying-differences-between.html

(निको देखें

ये कुछ लिंक है कि मैं CallContext और ILogicalThreadAffinative (या LogicalSetData) के बारे में पाए जाते हैं लॉगऑनेट कॉलकॉन्टेक्स्ट का उपयोग करने के तरीके के बारे में इस लिंक में कैडेल का जवाब):

http://www.l4ndash.com/Log4NetMailArchive%2Ftabid%2F70%2Fforumid%2F1%2Fpostid%2F15288%2Fview%2Ftopic%2FDefault.aspx

शुभकामनाएँ!

+0

वेगेघे, उत्तर के लिए धन्यवाद। हालांकि, इनमें से कोई भी इस मुद्दे को संबोधित नहीं करता है। इन सभी चर्चाओं में निष्पादन का एक तार्किक धागा माना जाता है, जो ऐपडोमेन को पार कर सकता है या नहीं, और उस प्रकाश में CallContext बनाम LogicalCallContext में अंतर पर चर्चा कर सकता है। यह स्थिति यहां वर्णित बहु-लॉजिकल-थ्रेडेड परिदृश्य में CallContext बनाम LogicalCallContext से संबंधित है: http://www.wintellect.com/CS/blogs/jeffreyr/archive/2010/09/27/logical-call-context-flowing -डाटा-भर-थ्रेड्स-एपडोमेन-एंड-प्रोसेस.एएसपीएक्स –

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