2012-02-02 14 views
5

मेरे पास एक एमवीसी 3 एप्लीकेशन है जिसमें कस्टम हैंडलरर एट्रिब्यूट है ताकि मैं त्रुटि ईमेल कर सकूं। मुझे अक्सर "संभावित रूप से खतरनाक अनुरोध प्राप्त होता है। क्लाइंट से फॉर्म मान पता चला था", लेकिन यह केवल फॉर्म मान के पहले कुछ वर्ण दिखाता है जो अपवाद का कारण बनता है। मैं एक संपूर्ण विचार मानना ​​चाहता हूं जो एक बेहतर विचार प्राप्त करने के लिए दर्ज किया गया था यदि इनपुट उपयोगकर्ता द्वारा दुर्भावनापूर्ण या आकस्मिक था। हालांकि, जब मैं हैंडलरर एट्रिब्यूट में फॉर्म मान खींचने का प्रयास करता हूं, तो यह वही त्रुटि फेंकता है! किसी भी विचार को मेरे अपवाद हैंडलर में सत्यापन के बिना request.Form से फॉर्म मान कैसे प्राप्त करें?मैं एमवीसी में "संभावित रूप से खतरनाक अनुरोध। क्लाइंट से फॉर्म मान का पता चला" फ़ॉर्म मान कैसे प्राप्त करूं?

public class HandleErrorLogAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext context) 
    { 
     base.OnException(context); 

     //Record Error 
     string errorDetails = HttpUtility.HtmlEncode(context.Exception.ToString()); 

     // Throws "otentially dangerous..." error here 
     foreach (var key in context.RequestContext.HttpContext.Request.Form.AllKeys) 
     { 
      errorDetails += key + "=" + HttpUtility.HtmlEncode(context.RequestContext.HttpContext.Request.Form[key]); 
     } 

     // Send Email with errorDetails 
    } 
} 
+1

आप '[ValidateInput (false)] 'का उपयोग कर सकते हैं और इसे स्वयं सत्यापित कर सकते हैं। –

+0

यह ठीक है कि यह एक त्रुटि उत्पन्न करता है, मैं सिर्फ यह जानना चाहता हूं कि किस इनपुट ने इसका कारण बनाया है। मैंने अपनी ऑनएक्सप्शन विधि में [ValidateInput (false)] जोड़ने का प्रयास किया, लेकिन यह अभी भी त्रुटि को फिर से फेंक दिया। – Austin

+0

ठीक है, 'ValidateInput' वास्तव में इसके लिए "काम नहीं करता है, कम से कम नहीं। [यहां क्यों है।] (Http://stackoverflow.com/questions/807662/why-is-validateinputfalse-not-working/2530823#2530823) असली मुद्दा यह है कि ऐसा करने का कोई सुरक्षित तरीका नहीं है जो केवल एक को प्रभावित करेगा कार्रवाई। यह एक वैश्विक सेटिंग है जो पूरे ऐप को प्रभावित करती है। –

उत्तर

12

एएसपी.NET 4.5 में, आप नई HttpRequest.Unvalidated.Form संपत्ति का उपयोग करने में सक्षम होंगे।

तब तक, आप निजी HttpRequest._form क्षेत्र को पढ़ने के लिए प्रतिबिंब का उपयोग कर सकते हैं:

HttpRequest request = context.RequestContext.HttpContext.Request; 
NameValueCollection form = (NameValueCollection)request.GetType().InvokeMember(
    "_form", 
    BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, 
    null, request, null); 

ध्यान दें कि _form lazily HttpRequest.Form संपत्ति से आरंभ नहीं हो जाता है, तो यकीन है कि HttpRequest.Form कम से कम एक बार पहले से पहुँचा कर दिया गया है बनाते हैं।

+0

जानना अच्छा है, धन्यवाद। – Austin

+0

हाल ही में HttpRequest.Unvalidated.Form के बारे में नहीं पता था। धन्यवाद। –

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

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