2012-10-19 18 views
9

फेंकने के लिए लॉगिंग एक एमवीसी 4 नियंत्रक एक्शन लक्ष्यीकरण .NET 4.0 के अंदर AsyncTargetingPack का उपयोग कर SQL सर्वर को कुछ जानकारी लॉग इन करने का प्रयास कर रहा हूं। मैं .NET 4.5 के लिए सीधे कूद, लेकिन मेरे ऐप Azure और we're still waiting for the update में रहती है ... के रूप में की उम्मीद (एक पंक्ति कोई अपवाद नहीं फेंक दिया के साथ अपने डेटाबेस के लिए लिखा है)Async लॉगिंग एक NullReferenceException

इस कोड काम करता है:

public class SystemActionLogger : ISystemActionLogger 
{ 
    private readonly ActionBlock<Tuple<SystemAction, object>> actionBlock; 

    public SystemActionLogger(ISystemActionLogEntryRepository repository) 
    { 
     actionBlock = new ActionBlock<Tuple<SystemAction, object>>(
      entry => TaskEx.Run(async() => 
       { 
        string data = await JsonConvert.SerializeObjectAsync(entry.Item2); 
        await repository.PersistAsync(new SystemActionLogEntry(entry.Item1, data)); 
       })); 
    } 

    public void Log(SystemAction systemAction, object data) 
    { 
     actionBlock.Post(new Tuple<SystemAction, object>(systemAction, data)); 
    } 
} 

और

public class SystemActionLogger : ISystemActionLogger 
{ 
    private readonly ActionBlock<Tuple<SystemAction, object>> actionBlock; 

    public SystemActionLogger(ISystemActionLogEntryRepository repository) 
    { 
     actionBlock = new ActionBlock<Tuple<SystemAction, object>>(async entry => 
      { 
       string data = await JsonConvert.SerializeObjectAsync(entry.Item2); 
       await repository.PersistAsync(new SystemActionLogEntry(entry.Item1, data)); 
      }); 
    } 

    public void Log(SystemAction systemAction, object data) 
    { 
     actionBlock.Post(new Tuple<SystemAction, object>(systemAction, data)); 
    } 
} 

NullReferenceException: इस कोड को एक NullReferenceException फेंकता है "। ऑब्जेक्ट संदर्भ एक वस्तु का एक उदाहरण के लिए सेट नहीं"

Server stack trace: 
    at System.Web.ThreadContext.AssociateWithCurrentThread(Boolean setImpersonationContext) 
    at System.Web.HttpApplication.OnThreadEnterPrivate(Boolean setImpersonationContext) 
    at System.Web.LegacyAspNetSynchronizationContext.CallCallbackPossiblyUnderLock(SendOrPostCallback callback, Object state) 
    at System.Web.LegacyAspNetSynchronizationContext.CallCallback(SendOrPostCallback callback, Object state) 
    at System.Runtime.CompilerServices.TaskAwaiter.<>c__DisplayClassa.<OnCompletedInternal>b__0(Task param0) 

Exception rethrown at [0]: 
    at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>b__1(Object state) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 
    at System.Threading.ThreadPoolWorkQueue.Dispatch() 

मुझे अपवाद में कोई दृश्यता नहीं है क्योंकि यह सभी बाहरी कोड है। मुझे समझ में नहीं आता कि कोड का दूसरा ब्लॉक क्यों विफल रहता है। यह वह कोड है जिसे मैंने मूल रूप से लिखा था।

मैं क्या गलत कर रहा हूं?

+0

एएसपी.नेट को 'async' के लिए विशेष समर्थन की आवश्यकता है, जिसे .NET 4.5 में जोड़ा गया था। मैं .NET 4.0 के लिए ASP.NET ऐप्स पर Async लक्ष्यीकरण पैक का उपयोग करने का प्रयास नहीं करूंगा - कुछ साधारण चीजें काम करती हैं लेकिन एएसपी.नेट पाइपलाइन सिर्फ 'async' कोड देखने के लिए तैयार नहीं है। –

+1

आपके स्टैक ट्रेस में 'LegacyAspNetSynchronizationContext' का संदर्भ शामिल है, जो .NET 4.5 में जोड़ा गया एक प्रकार है। क्या आपने अपने Azure सर्वर पर .NET 4.5 इंस्टॉल किया था? –

+0

हे स्टीफन, उत्तर के लिए धन्यवाद। मैंने आपके द्वारा एक और एसओ पोस्ट पर एक समान प्रतिक्रिया देखी थी और उम्मीद कर रही थी कि यह मामला नहीं था, खासकर कोड कोड के पहले ब्लॉक के बाद से। इस प्रकार के बारे में, मेरे पास मेरे बॉक्स पर .NET 4.5 स्थापित है, लेकिन मैंने हुप्स के माध्यम से कूदने और Azure को अपने परिनियोजन पैकेज का हिस्सा बनाने का प्रयास नहीं किया। यह एक दिलचस्प अवलोकन है। –

उत्तर

0

डेटाफ्लो केवल .NET 4.5 पर काम करता है। तथ्य यह है कि आप इसे .NET 4.0 पर चला रहे हैं असमर्थित है और संभवतः आप नकली अपवाद क्यों देख रहे हैं।

5

मुझे एक बहुत ही समान समस्या थी (लॉगिंग कार्य का उपयोग करते समय एसोसिएटविथकंटेंट थ्रेड से NullReference)।

मेरा मुद्दा यह था कि मूल कार्य लॉगिंग कार्य को पूरा करने का इंतजार नहीं कर रहा था, इसलिए जब लॉग खत्म हो जाता है और मूल धागे में फिर से जुड़ने का प्रयास करता है तो मूल थ्रेड समाप्त हो जाता है क्योंकि मूल धागा समाप्त हो जाता है।

यह सुनिश्चित करके मेरे लिए हल किया गया था कि अनुरोध नियंत्रक लॉगिंग फ़ंक्शन का इंतजार कर रहा था।

-2

मुझे यह समस्या थी .net4.5 जब मेरी वेब सेवा एक और डब्ल्यूसीएफ सेवा को एसिंक तरीके से आ रही थी। मैंने बस एक संक्षिप्त समय Wait() जोड़ा क्योंकि मुझे प्रतिक्रिया (टेलीमेट्री इवेंट) की परवाह नहीं थी।

public static void Event(string key, string message) { 
    Telemetry.Event(key, message).Wait(100); 
} 
संबंधित मुद्दे