आपको लगता है कि विरासत में एक कस्टम प्रकार के httpRuntime
तत्व की requestValidationType
विशेषता सेटिंग से इस पर और अधिक कुशल नियंत्रण प्राप्त कर सकते हैं System.Web.Util.RequestValidator
से और IsValidRequestString
ओवरराइड करता है।
दुर्भाग्यवश यह वेबएपीआई पाइपलाइन का हिस्सा नहीं है, इसलिए सीधे एक्शन फ़िल्टर जैसी चीजों की जांच नहीं कर सकता (यानी नियंत्रक विधियों पर विशेषताओं)।
हालांकि, यदि आप विशेष रूप से फॉर्म फ़ील्ड के सत्यापन के बारे में परवाह करते हैं, तो सत्यापनकर्ता इन तक पहुंच नहीं पाते हैं, जब तक आप उन्हें एक्सेस नहीं करते हैं, जो एक्शन फ़िल्टर को निकाल दिए जाने के बाद होता है, इसलिए आप एक विशेषता का उपयोग करके सत्यापन का विकल्प निकाल सकते हैं निम्नलिखित की तरह कक्षाएं बनाने ...
public class AllowFormHtmlAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
HttpContext.Current.Items["AllowFormHtml"] = true;
}
}
public class CustomRequestValidator : RequestValidator
{
protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
{
if (context.Items["AllowFormHtml"] as bool? == true && requestValidationSource == RequestValidationSource.Form)
{
validationFailureIndex = 0;
return true;
}
return base.IsValidRequestString(
context, value, requestValidationSource, collectionKey, out validationFailureIndex);
}
}
... तो बस, [AllowFormHtml]
हालांकि साथ अपने नियंत्रक विधि व्याख्या आप HttpRequest से सीधे प्रपत्र फ़ील्ड्स पर पहुंचते हैं तो, यह HttpRequest.Unvalidated
उपयोग करने के लिए आसान है , जो सत्यापन को बाईपास करता है।
यह एकमात्र समाधान है जो मेरे लिए काम करता है। 'RequestValidationMode =' 2.0'' को web.config में जोड़ना और कार्रवाई विधि पर '[ValidateInput (false)] विशेषता का प्रयास नहीं किया।मैंने अनुरोध के बाद काम करना शुरू कर दिया 'अनुरोधपैलिड कैरेक्टर = "" '। मुझे लगता है कि ऐसा इसलिए है क्योंकि यहां त्रुटि Request.Form सत्यापन के बजाय Request.Path सत्यापन का हिस्सा है। – quakkels
इसे वैश्विक होने की आवश्यकता नहीं है, पथ को प्रतिबंधित करने के लिए बस 'स्थान' तत्व का उपयोग करें। तो यदि आपका वेब एपीआई रूट 'एपीआई/फू' के अंतर्गत है तो आप स्थान को 'path = "api/foo" पर प्रतिबंधित कर सकते हैं और 'httpRuntime' कॉन्फ़िगरेशन जोड़ सकते हैं। पुष्टि की यह आईआईएस में ठीक काम करता है। एमएसडीएन ने स्पष्ट रूप से कहा है कि मशीन, साइट, एप्लिकेशन और उपनिर्देशिका स्तर पर घोषित '' घोषित किया जा सकता है। मैंने जवाब अपडेट किया। –
kamranicus