坏人

平常心

"ASP.NET AJAX RC1(疑似缺陷)"及"URL重写"及"浏览器缓存"三个凑到一块后的问题

小弟最近被迫使用Ajax,于是使用了asp.net ajax来实现,恩,那个简单呀,三下两下就搞定了...但问题也立马就出来了,和我的url重写冲突了,我的url重写模块是我自己写的,做了一个过滤器早就把服务器form的提交位置有错的问题解决过,但是现在只要是第2次使用ajax做回发,就会报告404错误,来cnblogs看到有人说到此问题,居然说通过修改action的方式可以解决,很纳闷,action那我早就解决过,而且看起来也是最好的解决办法...于是开了个钩子程序,抓了ie每次的最终post地址,发现在ajax第2次回发之后,就会将他的提交地(不是页面的action而是aspnet ajax内部用js生成的一个叫form._initialAction的东西)址改为相对路径,当然会有问题了,所以请发现url重写与ajax冲突的兄弟,注意测试好这个问题,不要让东西上了线才发现问题...更不要认为修改了action就万事大吉了...这个问题,其实我更认为是“ASP.NET AJAX RC1”的缺陷,为什么要用相对路径呢?老实点直接把action拿过来,不要搞那么多奇怪的处理不是更好吗?当然了,我并不了解他的设计原理,估计也是有他自己的理由吧,解决这个问题的相关代码如下:

    <!--Ajax脚本管理器-->
    
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
    
<script type="text/javascript">
    Sys.Application.add_load(function()
    
{
        var form 
= Sys.WebForms.PageRequestManager.getInstance()._form;
        var href 
= window.location.href;
        
if(href.indexOf("?"> 0)
        
{
            href 
+= "&a=" + Math.random();
        }

        
else
        
{
            href 
+= "?a=" + Math.random();
        }

        
        form._initialAction 
= href;
        form.action 
= href;
    }
);
    
</script>

大家可能注意到了,这段代码给地址加了个随机数,其实是为了解决后面个问题(浏览器缓存冲突)的,不过并没有解决好。。。

OK,重写冲突解决了,第2个问题又发生了。。。经过推测,我觉得是浏览器缓存的问题,我做了一个tags的添加删除的功能,添加就不用多说了,删除就是在Repeater中放了个ImageButton,通过他的click事件,使用CommandName把当前tag传回去并删除掉,这时候问题出现了,当我添加多个tag后,点其中一个删除,updatepanel中的tags列表返回了添加第1个之前的状态,于是我很怀疑是浏览器缓存的问题,我又很傻的在server代码中加入了
            Response.Cache.SetNoStore();
            Response.Cache.SetLastModified(DateTime.Now);
希望可以解决问题,但事实上根本没用,呵呵,于是我又通过上面那段js代码,在赋予form._initialAction的时候给url的最后加了一个随机数,结果还是无效。。。猜想问题估计是出现在这个随机数并没有每次得到效果,但我又真是没时间去深入的理解asp.net ajax的原理,所以希望知道此问题如何解决的哥们先帮兄弟解决一下,小地回头再去研究。

posted on 2007-01-08 11:05 坏人 阅读(3775) 评论(19)  编辑 收藏

评论

#1楼  2007-01-08 12:16 APPLE[匿名] [未注册用户]

不好意思
问个菜鸟问题
http://www.baidu.com/s?cl=3
比如这个地址 但是他并没有扩展名 这个也是url重写的吗?
还是做了什么特别设置?   回复  引用    

#2楼  2007-01-08 13:18 Cat Chen      

@APPLE[匿名]
UrlRewrite的说法对特定的服务器才有效吧。如果服务器是自己写的,识别URL可以与硬盘上的文件根本没有人关系,也就不存在UrlRewrite的说法。   回复  引用  查看    

#3楼 [楼主] 2007-01-08 13:51 cnlamar      

你可以把url重写看作是一种通用WEB服务器上的一个插件这样的东西,要实现对URL的处理,方法太多,最根本的无非就是监听到80的请求,分析http数据报文,然后做相应处理,只是我们都用的什么IIS APACHE他们来做WEB服务器,所以他们提供了相应的接口而已,至于baidu,他的壳好象是php的,至于没有扩展名,那无所谓,用IIS也可以做到,和url重写没关系。   回复  引用  查看    

#4楼  2007-01-08 14:36 APPLE[匿名] [未注册用户]

明白了 谢谢
接下来的一个问题就是
用IIS怎么做到呢? 很感兴趣 嘿嘿
困扰了很久这个问题   回复  引用    

#5楼  2007-01-08 15:08 木野狐      

通过 asp.net 的 HttpModule 或 HttpHandler 实现 URL Rewrite 可能会存在 postback 判定的问题,从请求的处理流程上来说,可能是晚了一步。通过找一个合适的专门做 URL Rewrite 的 ISAPI filter 程序应该能解决这个问题,让重写动作始终在进入 ASP.NET 进程的处理动作之前发生。   回复  引用  查看    

#6楼  2007-01-08 15:30 Jeffrey Zhao      

既然是POST的话为什么会缓存呢?而且您又用了随机的URL,这肯定不是缓存的原因。
事实上我没有看懂您现在的问题,修改action的方法其实能够解决问题阿,事实上已经解决了很多次这个问题了。莫非您有些特殊的情况?

我觉得其实这倒不能说是ASP.NET AJAX RC的缺陷,应该说,这只是“没有办法”才发生的问题。

您能不能把出现的问题打个包发到jeffreyzhao1985@hotmail.com让我研究一下呢?:)   回复  引用  查看    

#7楼 [楼主] 2007-01-08 17:20 cnlamar      

我没有测试过IIS对无扩展名的如何处理,你可以试试用通配符来解决,但那样就意味着你的处理程序会接管一切请求,性能会很大受损。。。cnblogs所用的text好象就是这样。。。

木野狐,不明白postback 判定的问题是什么。。。呵呵。。。

Jeffrey Zhao,其实我用缺陷俩字就是希望引起更多人注意,帮忙解决,呵呵。。。问题依旧没有解决,不过通过数小时的琢磨,问题确实没有发生在IE缓存那,我是今天才开始接触aspnet ajax这个东西的,之前只是看过,但都没怎么用过,更不要说深入的了解了,但项目进度很紧,现在根本容不得我慢慢消化理解。。。但是今天在网上看见有人提到,说好象是回发的内容,在呈现之前,无法被谁谁谁获得怎么的,我也没看得很明白,我确实不了解这玩意的运作流程,但现在我基本肯定的是,出现这个问题的时候,服务器的事件没有被执行,但请求肯定发出了,我用抓包程序看见请求从IE出去了。。。我找找关于那个的说法,贴出来麻烦各位帮忙看看   回复  引用  查看    

#8楼 [楼主] 2007-01-08 17:21 cnlamar      

发现用了这东东后,希奇古怪的毛病真够多的。。。发现自己跟不上时代的步伐了,呵呵。。。   回复  引用  查看    

#9楼 [楼主] 2007-01-08 17:31 cnlamar      

我搜索到的一个文章,他遇见的问题与我应该是一样的,其中一个评论比较有意义,但我在pageload中无论如何都将相应的Repeater进行DataBind,如评论中所说的那样,但是问题依然持续。。。

triffang(⊙珠海的沙漠⊙) ( ) 信誉:98 Blog 2006-10-27 21:31:23 得分: 15



Dflying Chen的说法
原因在于,Beta 1中所有的客户端脚本统一由ScriptManager管理,而ScriptManager是在PreRender时期遍历页面中的控件并输出必要的客户端脚本,但模板中的内容通常也是在PreRender时才生成的,这样二者错失了沟通的机会,自然模版中的Extender Control所必须的客户端脚本将不会被发送至浏览器,也就最终导致了Extender Control无法在模板控件中使用。

解决方法就是在PreRender之前,例如Load事件中强制让页面生成模版控件或数据绑定控件的内容,这样在PreRender的时候ScriptManager就可以正确找到他们了:
protected void Page_Load(object sender, EventArgs e)
{
GridView1.DataBind(); // 数据绑定控件用这个

object o = Login1.Controls; // 模版控件用这个
}   回复  引用  查看    

#10楼 [楼主] 2007-01-08 17:42 cnlamar      

Jeffrey Zhao,由于代码关联度比较大,光发那个页面基本肯定是跑不起来的,呵呵,发整个个工程又太大,或者在不跑起来的情况下直接看看代码,看能否解决问题吧?   回复  引用  查看    

#11楼  2007-01-08 20:02 Jeffrey Zhao      

@cnlamar
这个是比较早版本的问题了(似乎是Beta 1?),现在还存在吗?
您能否特意“制造”一个出线问题的简单页面呢?如果没有的话,我们想想看,解决问题的方法吧,比如哪里能访问到这个页面呢?:)   回复  引用  查看    

#12楼  2007-01-09 10:43 小废物 [未注册用户]

博主你好^_^

我是51CTO技术博客的大管家,博友向51CTO博采众客栏目推荐了您这篇文章。“博采众客”收录来自各个博客的优秀原创文章,链接直接指向该博客文章。希望我们的推荐能让更多的博友分享您的作品! (查看推荐:http://blog.51cto.com/digest

博采众客的参与者都有机会获得奖品,详情请见:
http://51ctoblog.blog.51cto.com/blog/26414/9910

如果您不希望被我们推荐,请以登陆名回复说明,并发邮件至blog@51cto.com,我们会取消对您的链接,谢谢!
  回复  引用    

#13楼 [楼主] 2007-01-09 11:50 cnlamar      

问题解决了,其实和ajax本身无关,是那个页面本身导致的,但由于ajax将一切的异常给屏蔽了,并且将之前的数据给返回来进行了填充,导致我误会了错误发生的地方。。。不过说实话,aspnet ajax这样做,很容易让人误会,或许是因为我用的版本非debug?   回复  引用  查看    

#14楼  2007-01-09 15:34 Jeffrey Zhao      

@cnlamar
因为是异步PostBack,有时候Debug的确不是很方便,不过一般来说使用一个截包工具,再加上客户端和服务器端的调试工具就会很方便了。:)   回复  引用  查看    

#15楼  2007-01-09 21:52 cnlamar[匿名] [未注册用户]

但是我认为至少应该在处理过程中如果出现了异常,应该以某种方式体现出来,我虽然对这东东了解不深,但直觉告诉我,他应该是走完了整个asp.net流程,不过在最后呈现的时候做了控制,只呈现出了updatepanel这个控件,然后将其返回填充以实现的,那么在这种情况下,遇见页面发生异常,并做一些处理抛出,应该是能够做到的,这样至少让使用者清楚的知道一个大致的错误定位。。。   回复  引用    

#16楼  2007-06-27 10:08 jack [未注册用户]

"问题解决了,其实和ajax本身无关,是那个页面本身导致的,"

cnlamar可以说一下你是怎样解决的吗?我也遇到过这样的问题,但一直都还没有解决   回复  引用    

#17楼 [楼主] 2007-07-17 09:32 cnlamar      

@jack

是页面代码本身有问题,但是异常被屏蔽了导致了我的错觉。   回复  引用  查看    

#18楼  2008-04-09 00:09 蓝奇高级验证码识别引擎QQ:631753663 [未注册用户]

出售蓝奇高级验证码识别引擎,可准确识别新浪动网淘宝CSDN等多种复杂验证码。

输出为一个标准DLL,可供VB,VC,Delphi,C#.NET,VB.NET,模拟精灵,按键精灵等多平台调用,调用方法简单,几行代码即可完成。独具特色的边缘检测字符分离、旋转倾斜纠正和通用字符匹配算法(无论字体和大小), 使得该引擎对于像新浪、动网、淘宝、CSDN等多种验证码均有不错的识别率,是一款效果较为理想的验证码识别引擎。附详细的调用实例和代码注释等相关技术文档。

官方网站 - http://***/yzm_advocr
识别效果怎么样一试就知道 - DEMO下载 http://***/yzm_advocr/advocr.rar
  回复  引用    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
 
 


<2007年1月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

公告

heycache2缓存,不做存储引擎,只是胶水。链接 7-30 23:48

与我联系

搜索

 

常用链接

留言簿(2)

我参与的团队

随笔分类

随笔档案

朋友

最新评论

阅读排行榜

评论排行榜