RSS 2.0 Feed
2007-04 Entries
摘要:昨天处理了一个奇怪的duplicated data entry的问题。我们的ASP.NET前台网页里有这么一个HtmlButton控件: <button runat="server" type="submit" id="yesButton" onserverclick="yesButtonClick">Click this</button>   在codebehind的yesButtonClick代码里我们会向一个web service发送一个请求来添加一个数据项: protected void yesButtonClick(object sender, EventArgs e) { // send request to the database web service }   在独立的UI automation测试的时候我们并没有发现问题。但在stress test的时候,我们发现数据库在很偶然的情况下会有两个一摸一样的数据项,并且他们的creation time stamp也是一摸一样的。而我们一直以为所有的数据项都是可以通过一个data field来唯一确认的,所以重复的data entry会给后来的程序逻辑带来很大的麻烦。 很显然在stress test的时候,我们在更新数据库的时候触发了很不容易发现的race condition而导致两个添加数据库记录的同时被执行了,而数据库方面也没有primary key这样的唯一性支持,而只是在添加一条记录前检查一下表内是否已经有了同样的一条记录,如果有就不添加,如果没有再添加,而这显然是无法避免race condition的,是数据库接口设计上的失误。 关键问题在于为什么我们的ASP.NET会同时触发两个添加记录的请求。研究了一下后才发现原来是yesButtonClick给调用了两次。一次是因为onserverclick(被ASP.NET的引擎转化为这样的客户端javascript: onclick=__doPostBack(...) ),另一次是因为type="submit"这个属性。因为每个aspx页面的最外层都是一个巨大的form,这个form的method是POST,action就是缺省就是页面本身。所以当把一个button的属性设置为submit的时候,button click这个时间就会自动触发一个form post,这样在服务器端,yesButtonClick就又被调用了一次。 解决的方法很简单,只要去掉type="submit"就好了。 我觉得这也许算不上一个bug,因为对ASP.NET引擎来说它生成的都是完全合法的html和javascript。但为什么有submit button引起的form post会在服务器端触发button click event handler是我不解的,或者说,我觉得不应该这样设计,或者至少该有个什么样的警告。而且我可以想见在某些情况下程序员有足够的理由一定要放上type="submit"这个属性,那时候怎么办?只能看着yesButtonClick被调用两次? 希望对以后碰到过同样的问题的朋友有些帮助。...[阅读全文]

posted @ | Feedback (4) |

摘要:想不出blog的标题时,我通常就写上Random Thoughts以作权宜,: ) Project的Alpha版已经进入RC2了,我们的项目会在一个星期后的Mix 07上发布,从去年9月中正式开始开发到今天Alpha版的基本尘埃落定,终于可以收拾一下散乱的心情做下来按自己的步调工作和学习一段时间了。 我们可能成功可能失败,但毕竟这是对几年来业界里于Web Service/SOAP/WSDL/UDDI等概念盲目狂热的一种很好的反思。我依稀记得我第一次接触SOAP时觉得这个东西居然也能自称“simple” (object access protocol) 实在是太大言不惭,而后来发现的更多很诡异的设计越发让我目瞪口呆。比如说WSDL和Proxy class这个东东,试想,你发布一个Web Service version 1.0后有很多用户下载了你的WSDL,生成了他们的Proxy class,编译了他们的程序,大家都很开心地过着和谐的生活。但某一天,用户突然发现他们的客户端全完了,不能用了,原因是你升级到version 2.0了,你原来的web service里定义了一个叫做weekday的enum类型,有7个值(monday - Sunday)。而在v2.0里这个enum含有8个值了(为了庆祝全球人民大团结,联合国决定一个星期有8天,第8天叫Crapday)。问题是这个enum类型通过WSDL和proxy class被紧耦合于客户端的程序中,但现在你的服务端的enum已经有13个值了...... 于是你告诉大家客户端也要跟着升级,而升级唯一的方法(注:在实际生活中被使用的,而不是理论上的it should work this way)就是通过email附件把新的WSDL文件发给各位亲爱的用户,他们要重新生成Proxy class,重新编译(without knowing if it will blow away their whole project or not),重新进行客户端unit testing,重新....... 于是客户很生气,后果很严重...... 所以很庆幸有这么一个机会可以亲手做一些anti Web Service/Soap/Wsdl/Uddi的东西。我们只想尽量的利用http协议提供的能力,不去发明什么眼花缭乱的evenlop、action header、blahblah,就是利用基于http的REST协议来存取分布式的数据,看看我们能做到什么程度。当然所有美好的想法都要经过实践的检验,我们做了自己心中的技术,但是否为大家所接受,我们无法预言,: ) Anyway,下星期天就要去Las Vegas参加Mix 07了。我一向懒怠拍照,希望这次能勤奋些做些现场报道回来给大家看看,: ) 另:偶然发现,我在intern时做过的一些东西现在已经收入MSDN了:http://msdn2.microsoft.com/en-us/library/ms776235.aspx  呵呵,我并没有参与最后收录MSDN前的编辑工作,不过看起来变化不大,甚至连screen shot也是那时我在自己的test machine上截取的那些。不知道有多少人真的熟悉MUI技术或者对它感兴趣,我那时候总是要和别人解释:no, it's not about doing English-Chinese translation,: ) "刚才在Keso那里看到贝壳网的创业以失败告终,突然触动了一个心事。以前这个想法一直很模糊,但刚才突然一下子很明朗了:很想有一天能放下一切,去杭州为一个startup工作一段时间。在那样的山水间纯粹地为自己的理想工作,应该是一件很快乐的事。" (以上引用自我的msn spaces blog)...[阅读全文]

posted @ | Feedback (6) |