1.
当我们输入非法字符(如:"<")时,asp.net会返回一个错误,这是由validateRequest控制的。在asp.net的管道处理中,第一步就是validateRequest,但验证失败并不会立即返回错误,它给Request对象的Form对象添加了一个异常,下图是调试的时候,在BeginRequest事件中截的:
这种异常不会马上报出来,但你一调用这个属性时,就会马上报出来。还有,当我调试时查看了此对象,这个异常就消失了,原本应返回客户端的错误变成了正常的返回。这些都是怎么做到的?
2.
如果是MVC,在controller创建之后,调用action之前,才会报错,估计是调用了Form属性之后,根据这个异常生成了返回端的错误页面。
那么如果我想全局禁用validateRequest应该怎么办(asp.net4.0)?
当我们输入非法字符(如:"<")时,asp.net会返回一个错误,这是由validateRequest控制的。在asp.net的管道处理中,第一步就是validateRequest,但验证失败并不会立即返回错误,它给Request对象的Form对象添加了一个异常,下图是调试的时候,在BeginRequest事件中截的:
这种异常不会马上报出来,但你一调用这个属性时,就会马上报出来。还有,当我调试时查看了此对象,这个异常就消失了,原本应返回客户端的错误变成了正常的返回。这些都是怎么做到的?
2.
如果是MVC,在controller创建之后,调用action之前,才会报错,估计是调用了Form属性之后,根据这个异常生成了返回端的错误页面。
那么如果我想全局禁用validateRequest应该怎么办(asp.net4.0)?
<pages validateRequest="false"></pages>
1. 在asp.net WebForm 4.0里面,可用,在asp.net MVC3里面,无效,因为mvc是直接到controller,validateRequest="false"是加在pages上的。
2. MVC3里面,可以通过在controller或action上加“[ValidateInput(false)]”来禁用。
<httpRuntime requestValidationType="RequestValidator"/>
web.config里的这句定义了asp.net的validator,默认的validator会在遇到"<>"时抛出异常,我们可以继承RequestValidator来自定义。
RequestValidator会验证很多类型,QueryString,Form,Cookie,Files,Url,Path等。
我们需要重写如下方法: public class CustomValidator : RequestValidator
{
protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
{
if (RequestValidationSource.Form == requestValidationSource
&& collectionKey == "需要忽略的那些input,或自己指定更复杂的规则")
{
value = context.Server.HtmlEncode(value);
}
return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);
}
}这时,遇到“<>”不会再抛出异常。
[AllowHtml]这种方法可以精确地控制到每一个传到服务器的字段。