当前位置:编程学习 > C#/ASP.NET >>

asp.net validateRequest原理探讨

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详细实现细节,不过.net 4.0下关闭validateRequest倒不难,web.config下<httpRuntime requestValidationMode="2.0" 。。。

页面里:

<%@ Page ValidateRequest="false" ... --------------------编程问答-------------------- 如果不想这么做,那么在Global.asax.cs里的Application_Error方法里截获这个异常,自己处理,应该也可以。 --------------------编程问答-------------------- 初步总结:

方案一:

<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)]”来禁用。 --------------------编程问答-------------------- 方案二:
<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);
        }
    }

这时,遇到“<>”不会再抛出异常。
--------------------编程问答-------------------- 方案三(MVC):

给需要验证的模型加上:
[AllowHtml]


这种方法可以精确地控制到每一个传到服务器的字段。
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,