词条统计
浏览次数:4425 次
编辑次数:8次 历史版本
最近更新:2013/6/20
创建者:掷鸡蛋者

本文来源:http://www.wojilu.com/forum1/topic/58 


简单一点说,web程序就是客户端(比如浏览器)发送请求给服务器,然后服务器返回字符串而已。但事实上,这个过程往往变得复杂无比。

现在让我们尽量简单的来看看,服务器和客户端的交互,一般需要用到哪些基础资源。

在.net中,服务器端需要用到的基础资源,基本上全部被包装在 HttpContext 对象中,通过 HttpContext ,你几乎可以完成任何复杂的程序。

HttpContext 封装了哪些数据呢?我们看一下 MSDN它的属性列表:


其实,其中最常用的属性是 Items 、Request 、Response、Session、Server 等对象。

这也就是为什么你自定义的 Handler,通过实现 IHttpHandler 接口,从而获取 HttpContext 之后,就可以完成整个应用请求。

看一下 wojilu mvc framework 的核心 Handler,即 CoreHandler,如下图所示:

在 wojilu framework 中,进一步对 HttpContext 进行了封装,以 WebContext 的面貌出现。这样做并非觉得微软的封装或接口不好,而是为了将来的测试或其他目的,有一个更加方便的对象调用。

然后,框架又对 WebContext 进行了封装,构造了一个 MvcContext 对象。注意,这个 MvcContext 对象,也即mvc框架的上下文对象,携带了整个框架使用过程中最常用的数据,你可以在任何controller中直接通过 ctx 属性来得到它。

如果你通过 HttpContext 对象,或者它的封装对象 WebContext 来进行编程,你得到的数据都是最原始的,比如要获取客户端QueryString,你需要通过 httpContext.Request.QueryString 来得到,但通过 MvcContext ,你可以在 controller 中 ctx.Get("") 就可以获取。

MvcContext 的 Get/GetInt/Post/PostInt 等方法,不仅仅是对 request.QueryString 和 request.Form 的封装,而且还进一步做了安全过滤。根据“防御式编程”的做法,应该默认客户端输入的数据都是危险的,或故意捣乱的。HttpContext 的 request.QueryString 和 request.Form 固然可以得到最原始的客户端数据,但这些数据因为没有做过过滤,所以往往带来危害。

有经验的 .net 程序员,一般都会对 request.QueryString 和 request.Form 的数据进行处理,而这个处理过程,在 web 开发中,几乎是每天、每时、每个页面中都会碰到。wojilu framework 觉得,应该将这个安全过滤的过程集中封装起来,在框架的使用过程中,程序员没有必要赤裸裸地面对危险的数据,所以就出现了 MvcContext 中的 Get/GetInt/Post/PostInt ,通过这些方法,你就不用害怕客户端恶意输入的 <script>alert 等脚本数据。因为 Get/GetInt/Post/PostInt 等方法已将之进行了过滤。你完全可以放心的存入数据库。当然,在存入数据库的时候,你一定要使用参数化方法,而不是直接拼接sql语句。更进一步,如果使用 wojilu orm,你连一些数据库参数化操作都不需要。

但是,在许多情况下,我们还是需要未经过滤的、原始的客户端数据,这时候怎么办?你可以通过 ctx.web 属性来调用 WebContext,一般这样就足够了,不推荐你通过 ctx.web.HttpContext 来使用。

这些 Get/GetInt/Post/PostInt 的命名含义是什么?我们通过一个表格来罗列一下。
(关于 GET/POST 方法更多参考:http://www.wojilu.com/Common/Page/25 )


Get对应了客户端通过GET方法发送过来的数据,也就是request.QueryString数据的过滤结果
Post对应了客户端通过POST方法发送过来的数据,不仅仅有表单提交的数据,还有ajax的post过来的数据,当然也是request.Form 数据的过滤结果。
GetInt/PostInt直接返回强类型的int型数据,带来了数据彻底的安全性,在开发过程中会用得很多,也是非常实用的方法
PostTime获取用户在表单中填充的时间型数据,结果是强类型的
PostDecimal 获取强类型的货币性数据
PostIdList 获取ID列表,这些ID数据都是检测过安全的。比如在数据列表管理中,通过全选,服务器端需要知道客户端选择了哪些ID
PostIsCheck 客户端复选框是否选定,如果返回1表示选定
PostHtml 获取客户端发送的Html文本(一般通过富文本编辑器),并对html中开头结尾一些无意义的&nbsp等字符做了过滤(防止用户故意输入一堆空格),以及对白名单列表中没有的tag标签做了过滤。
Ip获取客户端IP地址
PostValue 直接获取表单对象,比如 PostValue<User>() 方法将返回一个强类型的 User 对象,不用你先创建一个User,然后一个属性一个属性的给这个User赋值。当然,这个方法需要你在客户端表单控件的name属性符合格式,比如User对象,对应的表单控件的名称就是 user.Name 或 user.Gender 或 user.Age ;而 BlogPost 对象,对应的表单控件的name就是 blogPost.Title 等,换句话说,你需要使用class名称的camel格式。


另外, MvcContext 还有一个获取上传文件的方法:

HasUploadFiles 客户端是否上传了文件
GetFileSingle 获取客户端第一个上传的文件,是HttpFile类型,它是对HttpPostedFile的封装
GetFiles 获取上传的所有文件


对 cookie 和 session 的操作隐藏在 ctx.web 中,比如:

CookieGet( string key ) 获取cookie的值
CookieSet(String key, String val)设置cookie的值
CookieRemove( String key )删除某项cookie的值
CookieClear 彻底将所有cookie清理掉
SessionSet( String key, Object val ) 
SessionGet( String key )