|
昨天用VSTS 做WEB测试,录制完脚本,回放的时候,出现302 found 的错误提示。
我找到了 FTTP 状态码,查看,说明如下:
请求到的资源在一个不同的URL处临时保存。因为重定向有时会被更改,客户端应继续用请求URI来发出以后的请求。新的URL必须由回应中的位置域指定。除非是HEAD请求,否则回应的实体主体 (Entity-Body)必须包括对新URL超链接的简要描述。
如果用POST方法发出请求,而接收到302回应状态码。在这种情况下,除非用户确认,否则用户代理不必自动重定向请求,因为这将导致改变已发出请求的环境。
注意:当在接收到302状态码后而自动重定向POST请求时,一些现存的用户代理会错误地将其改为GET请求。
当时我都晕了,为啥会这样了,当时就卡在这里做不下去了。
过了N天,我在一次测试的时候发现输入的URI有点怪:
[urlss=http://www.xxxxxxxxx:8888/http://www.xxxxxxxxx:8888/]http://www.xxxxxxxxx:8888/http://www.xxxxxxxxx:8888/[/url](S(5fjqub552plofl553hvbqzjp))/LoginAdmin.aspx
注意红色的字,当时问开发,开发解释说是认证信息,这个啥东东了,我跑去问具体做这个页面的开发,他的回答让我大惊失色,他说不知道,没有注意到过。
他提到这段代码是从以前那个项目拷贝过来的,也不清楚怎么会有这段信息。
所以我们查啊查 最后发现原来如此。
原来他以前那个程序为了保证兼容性,在配置信息中把cookieless属性改成了UseUri,为什么会这样了 。
请请我详细道来:
为什么在asp.net 2.0 中,将原来cookieless属性只能设置true|false,改成了可以设置枚举HttpCookieMode的值,分别为:AutoDetect,UseCookies,UseDeviceProfile,UseUri 。
如果对表单验证很有经验的朋友可能会很清楚,可以有两种方式来保存当前的SessionID和用户的验证票信息,分别是使用Cookie和在URL地址加上
一串编码过的字符串来标识当前的SessionID和用户的验证票信息。
第一种方式非常普遍,对于使用URI来标识当前SessionID和验证票,
我相信如果不是特殊需要的话,相信很多人都会跟我一样还无法很好理解。我做了两个简单的页面,来模拟用户的验证过程。当我在web.config中设置 cookieless="AutoDetect"时,就跟我们平常一样,登录的URL是:
http://localhost:1115/FormsAuthentication/Security/Default.aspx
而当我设置cookieless="UseUri"时,这时URL地址就变成了:
http://localhost:1115/FormsAuthentication/(F(V0-gEZNEzXUqevbOqKwNoBcMf6vBWnyNbdpa2UhZzrfOUkGPvyB91-9nFlnBDmCAgdpz4gJ6kq-QOVjbNsvKig2))/Security/Default.aspx
在站点目录多了一级目录,这里的值就是当前会用户的验证票信息和SessionID信息。
在某些场合,这样做是非常有意义的(或者是必须的),因为在不支持cookie环境下,你要去标识一个是否属于同一个会话,当前用户是否已验证过,等等与会话相关信息的时候就会变得异常的困难。
了解了这两个保存会话信息的方式后,我们再来讨论一下,asp.net team为什么把原来只能设置true | false的属性改成可以设置不同的枚举值.首先我们来看看这4个值的含意:
AutoDetect:自动检测客户端实际是否支持cookie再来决定使用两种方式中的哪一种(最佳适应)。
UseCookies:不管客户端是否支持cookie,反正都使用cookie来标识(第一种方式)。
UseDeviceProfile:根据设备文件来判断是否支持cookie,进而决定使用哪种方式。
UseUri :与UseCookies类似的,不管客户端是否支持cookie,反正都使用第二种方式。
为什么要改cookieless属性的可选值呢?毫无疑问,是为了增加程序的可操控性。原来的值有点太过单一化了,二选一,没有商量的余地。现在我们可以根据各种不同的情况来让程序动态或程序员手动选择。我想这样做的一个目的就是为了能更好的兼容移动设备,兼容WAP的应用。目前还有很多的设备还并不支持cookie。
解决办法有三种:
1.设置cookieless = UseCookies,不管客户端是否支持cookie都使用cookie。
2.因为默认cookieless = UseDeviceProfile,所以可以为搜索引擎建立一个设备文件.browser,弄虚作假一下。《Get GoogleBot to crash your .NET 2.0 site》就有给出了这样的做法了。
3.修改程序,将里面的相对路径(~/)改成绝对路径表示(可以使用Resolve方法)。
其实是分享别人的成果,我这里就厚颜的占为己有了。
再回到我的测试这里,为什么会出302的提示了。
因为“(S(5fjqub552plofl553hvbqzjp))”这串编码过的字符串,每次打开网页都是不同的,而我们录制的时候却是死的,回放肯定回出错。
问题解决了,我和开发都心有感叹。
基本上很多开发都会在使用以前的代码,他潜意识认为以前用的好好,这里也肯定没问题,却没有考虑到大的使用环境变了,代码怎么能不跟着变;
用VSTS测试不是很多,这个问题比较特殊,估计很都多人都不会遇见,不过还是希望可以给迷茫中的朋友一点小小的帮助
[ 本帖最后由 kings727 于 2008-8-20 12:13 编辑 ] |
|