2010-10-12 3 views
5

हम एल्मा के साथ हमारी webservice त्रुटियों को लॉग करने के लिए here वर्णित दृष्टिकोण का उपयोग कर रहे हैं। और यह वास्तव में काम करता है, लेकिन दुख की बात है कि उपयोगकर्ता नाम मधुमक्खी खाली है।डब्लूसीएफ वेबसाइट सर्विसेज के लिए एल्माह के साथ उपयोगकर्ता नाम लॉगिंग

हमने कुछ डिबगिंग और पाया, कि त्रुटिHandler में त्रुटि लॉगिंग करते समय HttpContext.Current.User में सही उपयोगकर्ता सेट है।

हम यह भी कोशिश की:

HttpContext context = HttpContext.Current; 
ErrorLog.GetDefault(context).Log(new Error(pError, context)); 

और

ErrorLog.GetDefault(null).Log(new Error(pError)); 

सफलता नहीं मिली।

कोई विचार है कि हम एल्माह को उपयोगकर्ता नाम कैसे लॉग कर सकते हैं?

एक sidenote पर, सीधे webservice के भीतर त्रुटि लॉगिंग करते समय, उपयोगकर्ता नाम अपेक्षित के रूप में लॉग किया जाता है। लेकिन यह दृष्टिकोण लेना बहुत मुश्किल नहीं है।

उत्तर

4

एल्मा उपयोगकर्ता को Thread.CurrentPrincipal.Identity.Name से ले जाएं और HttpContext.Current.User से नहीं।

चूंकि एल्मा में कस्टम डेटा जोड़ने का कोई सुविधाजनक तरीका नहीं है, इसलिए मैं कोड को दोबारा जोड़ने और HttpContext.Current.User को कॉल करने का सुझाव दूंगा।

+0

क्या मैं सही हूँ कि साथ Pricipal की स्थापना: 'Thread.CurrentPrincipal = नए GenericPrincipal (नई जेनेरिक इडेंटिटी ("लाला"), नई स्ट्रिंग [0]) थ्रेडपूलिंग के कारण एक बुरा विचार है? – Thomas

+0

हां, आप थ्रेड प्रिंसिपल –

+0

के साथ गड़बड़ नहीं करना चाहते हैं और अगर मैं इसे elmah के साथ त्रुटि लॉग करने के बाद पुराने प्रिंसिपल पर वापस सेट करता हूं? – Thomas

2

यह एक सवाल है जिसे मैं बार-बार देखता हूं। कोड को दोबारा संकलित करने की संभावना एक संभावना है, मैं पहले से ही ईएलएमएएच में निर्मित सुविधाओं का उपयोग करने का सुझाव दूंगा, जैसा कि मेरे ब्लॉग पोस्ट Enrich ELMAH errors using error filtering hook में बताया गया है।

आपके मामले में, सभी त्रुटियों पर User संपत्ति की स्थापना, ErrorLog_Filtering -method जोड़कर प्राप्त किया जा सकता:

void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs args) 
{ 
    var httpContext = args.Context as HttpContext; 
    if (httpContext != null) 
    { 
     var error = new Error(args.Exception, httpContext); 
     error.User = httpContext.User.Identity.Name; 
     ErrorLog.GetDefault(httpContext).Log(error); 
     args.Dismiss(); 
    } 
} 
संबंधित मुद्दे