在.Net中有两种常用的Web开发方式,一种是Asp.Net WebForm,另一种是Asp.Net MVC。我先简单的给大家介绍下这两种开发方式的特点,然后再应用自定义脚本映射,反射,json2template.js,htm等技术演示一个纯静态的Web框架。

  Asp.Net WebForm

  在Asp.Net WebForm中,请求大都以.aspx为后缀,那么.Net是如何处理.aspx请求呢? 打开.Net的配置文件,

  .Net4.0配置文件地址(64位):C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config;

  .Net4.0配置文件地址(32位):C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\web.config。

  找到HttpHandlers的配置信息如下:

      <httpHandlers>
            <add path="eurl.axd" verb="*" type="System.Web.HttpNotFoundHandler" validate="True" />
            <add path="trace.axd" verb="*" type="System.Web.Handlers.TraceHandler" validate="True" />
            <add path="WebResource.axd" verb="GET" type="System.Web.Handlers.AssemblyResourceLoader" validate="True" />
            <add verb="*" path="*_AppService.axd" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="False" />
            <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="False"/>
            <add path="*.axd" verb="*" type="System.Web.HttpNotFoundHandler" validate="True" />
            <add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="True" />       ................................................

从以上配置信息可以看出所有的*.aspx请求都是交给PageHandlerFactory处理工厂去处理的。PageHandlerFactory定义如下:

  public class PageHandlerFactory : IHttpHandlerFactory2, IHttpHandlerFactory
    {
        public virtual IHttpHandler GetHandler(HttpContext context, string requestType, string virtualPath, string path);
        private IHttpHandler GetHandlerHelper(HttpContext context, string requestType, VirtualPath virtualPath, string physicalPath);
        public virtual void ReleaseHandler(IHttpHandler handler);
        IHttpHandler IHttpHandlerFactory2.GetHandler(HttpContext context, string requestType, VirtualPath virtualPath, string physicalPath);
    }

调用PageHandlerFactory的GetHandler会生成一个Page(IHttpHandler)类,然后调用Page类的ProcessRequest方法,再渲染*.aspx中的控件,最后生成Html给Response。如图:

  写一个简单的Web框架

  Asp.Net MVC

    在Asp.Net MVC中,所有的请求都交给UrlRoutingModule处理。通过UrlRoutingModule得到一个MvcRouteHandler。调用MvcRouteHandler的GetHttpHandler方法返回MvcHandler。然后调用MvcHandler的ProcessRequest方法,通过反射创建Controller实例,并执行其方法。如图:

      

      写一个简单的Web框架

      在Asp.Net WebForm和Asp.Net Mvc中,其实都是生成一个IHttpHandler的类,并调用其ProcessRequest方法,通过不同的渲染方式,把最终结果返回给用户。

  

  框架

      好了,WebForm和MVC就介绍到这里,下面开始写自己的框架了。我们知道Asp.Net MVC 包括:UrlRoutingModule(Url处理) + View(*.aspx)+Controller+ViewEngine,而我的框架包括:
     WebMethodHttpHandler(处理中心)+View(*.htm)+Controller(业务类)+Js(json2template.js渲染器),呵呵,跟Asp.Net MVC有点像。如图:

  写一个简单的Web框架

      框架中,静态页面都是以.htm为后缀,如:login.htm。动态请求都是以mthd为后缀,如:/User/CheckLogin.mthd。动态请求URL地址有一定的含义:如:/User/CheckLogin.mthd中,User代表业务处理类 UserController,CheckLogin就是UserController的一个方法(验证用户登录的方法)。

     我们已经知道,不管是WebForm还是Mvc,最终都需要生成一个IHttpHandler的类去处理请求。在我的框架中,我打算模仿WebForm对于*.aspx的处理方式,定义一个IHttpHandler去处理*.mthd请求。这个IHttpHandler的类定义为 WebMethodHttpHandler。WebMethodHttpHandler定义如下:

  

 1 public class WebMethodHttpHandler : IHttpHandler, IRequiresSessionState
 2     {
 3         public bool IsReusable
 4         {
 5             get { return false; }
 6         }
 7 
 8         public void ProcessRequest(HttpContext context)
 9         {
10             var request = context.Request;
11             var arr = request.Path.Split('/');
12 
13             string controllerName = arr[arr.Length - 2];
14             string methodName = Path.GetFileNameWithoutExtension(arr[arr.Length - 1]);
15 
16             var factory = ControllerBuilder.Current.GetControllerFactory();
17             var obj = factory.CreateController(controllerName, methodName);
18             var result = obj.Execute(request.Params);
19 
20             var js = new JavaScriptSerializer();
21             string json = js.Serialize(result);
22             context.Response.ContentType = "json/plain";
23             context.Response.Write(json);
24         }
25     }
View Code

相关文章:

  • 2021-11-07
  • 2021-04-29
  • 2022-12-23
  • 2022-12-23
  • 2021-05-05
  • 2021-09-29
  • 2022-02-10
  • 2021-12-05
猜你喜欢
  • 2021-12-10
  • 2022-12-23
  • 2021-11-12
  • 2022-12-23
  • 2021-11-02
  • 2021-11-02
相关资源
相似解决方案