问题描述
1.当我们输入非法字符(如:"<")时,asp.net会返回一个错误,这是由validateRequest控制的。在asp.net的管道处理中,第一步就是validateRequest,但验证失败并不会立即返回错误,它给Request对象的Form对象添加了一个异常,下图是调试的时候,在BeginRequest事件中截的:这种异常不会马上报出来,但你一调用这个属性时,就会马上报出来。还有,当我调试时查看了此对象,这个异常就消失了,原本应返回客户端的错误变成了正常的返回。这些都是怎么做到的?2.如果是MVC,在controller创建之后,调用action之前,才会报错,估计是调用了Form属性之后,根据这个异常生成了返回端的错误页面。那么如果我想全局禁用validateRequest应该怎么办(asp.net4.0)?
解决方案
解决方案二:
配置文件里设置吧
解决方案三:
配置文件里设置要把runtime改成2.0好像,感觉这种方案不太好,而且我也没去试这种方案行不行。
解决方案四:
顶一下,有没有大牛研究过这个?validateRequest是什么模块在处理?那种异常是怎么生成的?怎么在.net4.0下面完全关闭validateRequest?
解决方案五:
不清楚validateRequest详细实现细节,不过.net4.0下关闭validateRequest倒不难,web.config下<httpRuntimerequestValidationMode="2.0"。。。页面里:<%@PageValidateRequest="false"...
解决方案六:
如果不想这么做,那么在Global.asax.cs里的Application_Error方法里截获这个异常,自己处理,应该也可以。
解决方案七:
初步总结:方案一:<httpRuntimerequestValidationMode="2.0"/><pagesvalidateRequest="false"></pages>
1.在asp.netWebForm4.0里面,可用,在asp.netMVC3里面,无效,因为mvc是直接到controller,validateRequest="false"是加在pages上的。2.MVC3里面,可以通过在controller或action上加“[ValidateInput(false)]”来禁用。
解决方案八:
方案二:<httpRuntimerequestValidationType="RequestValidator"/>
web.config里的这句定义了asp.net的validator,默认的validator会在遇到"<>"时抛出异常,我们可以继承RequestValidator来自定义。RequestValidator会验证很多类型,QueryString,Form,Cookie,Files,Url,Path等。我们需要重写如下方法:publicclassCustomValidator:RequestValidator{protectedoverrideboolIsValidRequestString(HttpContextcontext,stringvalue,RequestValidationSourcerequestValidationSource,stringcollectionKey,outintvalidationFailureIndex){if(RequestValidationSource.Form==requestValidationSource&&collectionKey=="需要忽略的那些input,或自己指定更复杂的规则"){value=context.Server.HtmlEncode(value);}returnbase.IsValidRequestString(context,value,requestValidationSource,collectionKey,outvalidationFailureIndex);}}
这时,遇到“<>”不会再抛出异常。
解决方案九:
方案三(MVC):给需要验证的模型加上:[AllowHtml]
这种方法可以精确地控制到每一个传到服务器的字段。