1.
当我们输入非法字符(如:"<")时,asp.net会返回一个错误,这是由validateRequest控制的。在asp.net的管道处理中,第一步就是validateRequest,但验证失败并不会立即返回错误,它给Request对象的Form对象添加了一个异常,下图是调试的时候,在BeginRequest事件中截的:
这种异常不会马上报出来,但你一调用这个属性时,就会马上报出来。还有,当我调试时查看了此对象,这个异常就消失了,原本应返回客户端的错误变成了正常的返回。这些都是怎么做到的?
2.
如果是MVC,在controller创建之后,调用action之前,才会报错,估计是调用了Form属性之后,根据这个异常生成了返回端的错误页面。
那么如果我想全局禁用validateRequest应该怎么办(asp.net4.0)?

解决方案 »

  1.   

    配置文件里设置要把runtime改成2.0好像,感觉这种方案不太好,而且我也没去试这种方案行不行。
      

  2.   

    顶一下,有没有大牛研究过这个?validateRequest是什么模块在处理?那种异常是怎么生成的?怎么在.net4.0下面完全关闭validateRequest?
      

  3.   

    不清楚validateRequest详细实现细节,不过.net 4.0下关闭validateRequest倒不难,web.config下<httpRuntime requestValidationMode="2.0" 页面里:<%@ Page ValidateRequest="false" ...
      

  4.   

    如果不想这么做,那么在Global.asax.cs里的Application_Error方法里截获这个异常,自己处理,应该也可以。
      

  5.   

    初步总结:方案一:<httpRuntime requestValidationMode="2.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)]”来禁用。
      

  6.   

    方案二:
    <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);
            }
        }这时,遇到“<>”不会再抛出异常。
      

  7.   

    方案三(MVC):给需要验证的模型加上:
    [AllowHtml]这种方法可以精确地控制到每一个传到服务器的字段。