现在的位置: 首页 > 综合 > 正文

ASP.NET 核心机制全方位瓦解分析

2011年03月27日 ⁄ 综合 ⁄ 共 4599字 ⁄ 字号 评论关闭

 

VISION:

后台使用c#编写服务端(=codebehind) 

前台使用js+ajax交互。

取消viewstate功能。

 

handler本质上是无状态的,因此每次都需要传入数据。 现在就要换一种开发思路。

 

-------------------------------------------------------------------

http://www.cnblogs.com/artech/archive/2007/04/06/702658.html

浅谈ASP.NET的Postback 

 

点击一个button的postback: 

代码
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />                
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTA0NDQ2OTE5OWRk281L4eAk7iZT10hzg+BeOyoUWBQ=" />

 

 

Server端通过__EVENTTARGET这个hidden field的值找到对应的Server端的Control 

那么调用Page的RaisePostBackEvent方法

代码
[EditorBrowsable(EditorBrowsableState.Advanced)]
protected virtual void RaisePostBackEvent(IPostBackEventHandler sourceControl, string eventArgument)
{
    sourceControl.RaisePostBackEvent(eventArgument);
}

 

代码
protected virtual void RaisePostBackEvent(string eventArgument)
{
    
base.ValidateEvent(this.UniqueID, eventArgument);
    
if (this.CausesValidation)
    {
        
this.Page.Validate(this.ValidationGroup);
    }
    
this.OnClick(EventArgs.Empty);
    
this.OnCommand(new CommandEventArgs(this.CommandName, this.CommandArgument));
}

 

 

这篇文章,大概知道,通过hiddenfield + input,服务器反射获取对象,然后指定接口触发调用。问题就在于,是否一个httpHandler反射对象然后加载? 还是有很多个?

 

http://www.cnblogs.com/artech/archive/2007/05/21/753620.html

深入剖析ASP.NET的编译原理之一:动态编译(Dynamical
Compilation)

 

asp.net里面一个page1。动态编译为: 

 Page1和Page2的编译后的Type name变成了part_i_page1_aspx& Page1part_i_page2_aspx& Page2

 part_i_page1_aspx中定义了一个基于aspx的HttpHandler所需的所有操作,并且它继承了Page1。

 对Part I/Page1的Http Request,ASP.NET所要做的就是生成一个part_i_page1_aspx来Handle这个request就可以了。 

还有一个FastObjectFactory, 高效的生成对象。而生成的是什么样的对象呢?实际上就是基于每个aspx的Http request的Http handler,对于Part I/Page1就是我们上面一节分析的part_i_page1_aspx对象。

 

一个页面,会对应一个handler,这个handler包含了页面的所有对象(textbox....) ,而且这些对象是动态生成的。被反射调用。

 

现在我们来总结整个动态编译的过程:

 

Step1:当ASP.NET收到对于某个Page的Request,根据这个request对应的Url试着找到该page对应的Preservation File,如果没有找到,重新编译Page所在目录下的所有需要编译的文件,同时生成一些额外的文件,包括Preservation File。

 

Step2:然后解析这个Preservation File,通过hash和filehash判断文件自身或者是Dependent File是否在上一次编译之后进行过任何的修改,如果是的,则重新编译。然后重新执行Step2。

 

Step3:通过Preservation File 的assembly attribute Load对应的assembly(如果Assembly还没有被Load的话),通过type获知对应的aspx type,然后借助FastObjectFactory的对应的Create_ASP_XXX创建这个type。这个新创建的对象就是我们需要的Http Handler,在之上执行相应的操作把结果Response到客户端。

 

-------------------------------------------------------------------

 

http://www.theserverside.net/tt/articles/showarticle.tss?id=IIS_ASP

  Inside IIS & ASP.NET

 IIS communicates with the .NET framework through unmanaged ISAPI extensions: aspnet_isapi.dll and aspnet_filter.dll.

 along with the state Windows service (aspnet_state.exe) and the ASP.NET worker process (aspnet_wp.exe) are the core of the ASP.NET processing model.

<add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory"/> 

 


Implementing IHttpHandlerFactory

Where HTTP handlers may be useful in responding to requests for specific resources, a handler factory makes it possible to intercept a request, perform some pre-processing on the request, and then following a factory pattern, create the handler for the resource.

 

 

----------------------------------------------------------------------- 

http://msdn.microsoft.com/en-us/library/ms972976.aspx

Understanding ASP.NET View State

 

View state's purpose in life is simple: it's there to persist state across postbacks.

 

----------------------------------------------------------------------- 

ASP.NET MVC 入门:

http://www.cnblogs.com/qleelulu/archive/2008/10/05/1303997.html

/Views/{Controller}/{Action}.aspx 

 

asp.net mvc 的页面实际上是一些<%% > 进行模板解析。

 

Q:在mvc中,如何才持久数据?例如在后台获取某个txtbox的text?

理论上是无法获取的。因为是无状态的,除非请求主动发送。 

 

----------------------------------------------------------------------- 

http://www.cnblogs.com/jmtek/archive/2006/02/16/331961.html


ASP.NET运行模式:PageHandlerFactory

 

 

JS框架如何和服务器交互? 

------------------------------------

http://www.pin5i.com/showtopic-20894.html

ExtJS 中使用Asp.net编写后台服务器程序的几种方式

1. wcf

2. 写一个aspx,在page_load里面对request的string进行switchcase

3. 继承httphandler,  反射method进行操作。

 

http://tech.it168.com/a2010/0106/833/000000833411.shtml

现有的Ajax从框架角度分级的话,可以有以下分类:

  ·零级,完成base工作,包括扩展原有对象的方法,Ajax通讯部分,比较精简。

  ·一级,完成effect工作,包括增加常用效果转换函数,如tween、drag、maskLayer、fade等的特效。

  · 二级,完成component工作,包括对话框、列表、树、日历等的组件。

  ·三级,完成application工作,包括完整的前端平台,允许用户定义能实现一定功能的模块。

  一些框架只做零级,如Prototype.js,一些框架做到一级,如jQuery ,一些框架做到了三级,如Asp.net Ajax 和EXT。

  选择合适的Ajax框架能提升程序效率,减少开发工作量,优化显示效果等作用。

 

---------------------------------------

 

理想中的开发框架:

 

1. 使用js实现智能参数回传(js+hidden input + 反射方法体需要的对象id生成回调传入参数) 

private void onclick()

{

string username =  Postback["id"] ; // 这里得知控件id,然后生成html页面的时候动态生成js进行智能回调,实现高性能viewstate

}  

2. 使用asp.net / c#作为服务端技术。

不使用asp.net的项目,版本维护、代码关联很困难。直接使用类库进行服务端编写。因此需要实现factory。

asp.net 指定了assembly, classname 

客户端返回请求 Action.aspx,  映射成为metod.

 

3.   

抱歉!评论已关闭.