zoukankan      html  css  js  c++  java
  • ASP.NET本质论第一章网站应用程序学习笔记2

    1.初步走进ASP.NET

      上篇笔记我们讲述了服务器监听问题,这篇我们就要讲述具体的请求处理了,ASP.NET所涉及的类大多数定义在System.Web程序集中。

      在.NET中,程序集管理的最小逻辑单位为:应用程序域(AppDomain),对于.NET程序来说,可以动态加载程序集到应用程序域中,但是加载之后的程序集不能单独卸载,只能以应用程序域为单位整体来卸载,应用程序域提供了四个重要的机制:

        1) 隔离,不同应用程序域之间不能直接访问,跨应用程序域访问的对象必须派生自System.MarshalByRefObject。

        2) 卸载,被加载的程序集只能以应用程序域为单位卸载

        3) 安全,以应用程序域为边界的安全机制

        4) 配置,以应用程序域为边界的程序配置

      由于我们的应用程序将于Web应用程序运行子不同的应用程序域中,这就是涉及到了跨域的问题,在.NET中,跨域访问的类必须继承自System.MarshalByRefObject。

    2.Web应用程序域

      ApplicationHost类的静态方法CreateApplicationHost可以帮助我们创建Web应用程序所需要的应用程序域,并设置所有需要的参数,方法定义如下:

        public static Object CreateApplicationHost(Type hostType,string virtualDir,string physicalDir);

        注解:hostType:表示用来跨域访问的通信对象,他必须派生自MarshalByRefObject基类。virtualDir:表示是网站应用程序域的跟所对应的虚拟目录。physicalDir:表示网站应用程序所在的文件系统的文件目录。

        下面的例子演示了借助于ApplicationHost类创建新的应用程序域的过程:

     1 private static void Main(string[] args)
     2 {
     3     Type hostType = typeof (Intelligencer);
     4     Intelligencer intelligencer =
     5         System.Web.Hosting.ApplicationHost.CreateApplicationHost(hostType, "/",
     6                                                                     System.Environment.CurrentDirectory) as
     7         Intelligencer;
     8     Console.WriteLine("Current Domian ID:{0}
    ", AppDomain.CurrentDomain.Id);
     9     Console.WriteLine(intelligencer.Report());
    10     Console.ReadLine();
    11 }
    12 public class Intelligencer : MarshalByRefObject
    13 {
    14     public string Report()
    15     {
    16         AppDomain appDomain = AppDomain.CurrentDomain;
    17         StringBuilder builder = new StringBuilder();
    18         //应用程序域的信息
    19         builder.AppendFormat("Domain ID:{0}
    ", appDomain.Id);
    20         //对于每一个Web应用程序域,有一个HostingEncironment
    21         builder.AppendFormat("VirtualPath:{0}
    ", HostingEnvironment.ApplicationVirtualPath);
    22         builder.AppendFormat("PhysicalPath:{0}
    ", HostingEnvironment.ApplicationPhysicalPath);
    23         return builder.ToString();
    24     }
    25 }

    3.不使用GAC和bin加载Web应用程序域

      使用ApplicationHost创建应用程序域有一点麻烦的地方在于,必须将程序集注册到GAC中,或者复制到bin文件夹下,在Cassini项目中提供了一种可以在单个超过您续重实现的方式,代码如下:

     1 private static object CreateWorkerAppDomianWithHost(string virtualPath, string physicalPath, Type hostType)
     2 {
     3     //通过反射使用私有的BuildMangeHost类型,这种方式创建web应用程序域,不需程序集注册到GAC或者放置到bin文件夹
     4     //唯一的应用程序名
     5     string uniqueAppString = string.Concat(virtualPath, physicalPath.ToLowerInvariant());
     6     //获取唯一的Id
     7     string appId = (uniqueAppString.GetHashCode()).ToString("x");
     8     //在Web应用程序域中创建BuildManagerHost
     9     var appManager = ApplicationManager.GetApplicationManager();
    10     //System.Web.Compilation.BuildMangerHost是一个内部类,不能再CSDN查到
    11     var buildManagerHostType = typeof (HttpRuntime).Assembly.GetType("System.Web.Compilation.BuildMangerHos");
    12     //为应用程序域创建对象
    13     var buildManagerHost = appManager.CreateObject(appId, buildManagerHostType, virtualPath, physicalPath, false);
    14     //调用BuildManagerHost.RegisterAssembly方法将类型注册到应用程序域
    15     buildManagerHostType.InvokeMember("RegisterAssembly",
    16                                         BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.NonPublic,
    17                                         null, buildManagerHost, new object[2]
    18                                             {
    19                                                 hostType.Assembly.FullName,
    20                                                 hostType.Assembly.Location
    21                                             });
    22     //现在可以使用类型创建对象实例
    23     return appManager.CreateObject(appId, hostType, virtualPath, physicalPath, false);
    24 }

    4.ASP.NET工作者对象

      1) ASP.NET中,准备用于处理的请求,必须封装为HttpWorkerRequest类型的对象,这是一个抽象类,定义在System.Web命名空间中,类型定义如下:

        [ComvisibleAttribute(false)]

        public abstract class HttpWorkRequest

      2) HttpWorkRequst中的成员含有:网址:http://msdn.microsoft.com/zh-cn/library/system.web.httpworkerrequest(v=vs.110).aspx

      3) httpWorkRequest解决大文件上传

        借助于HttpWorkRequest的GetPreLoadedEntityBody和ReadEntityBody方法,我们可以分块的从客户端读取上传的文件内容,然后,将内容保存在一个临时文件夹中。

        案例地址:a:http://slickupload.com/

             b:http://www.cnblogs.com/wucountry/archive/2005/12/28/306725.html

    4.Web应用程序运行时

       1) System.Web.HttpRuntime类是整个ASP.NET服务器处理的入口,参考资料:

        http://msdn.microsoft.com/zh-cn/library/system.web.httpruntime(v=vs.110).aspx

       2) HttpRuntime的静态方法ProcessRequest将帮助我理解HTTP,方法的定义如下:

        public static void ProcessRequest(HttpWorkerRequest wr)

       3) 将HttpWorkerRequest对象传递给ProcessRequest方法,ASP.NET就开始服务器的请求处理任务了。

  • 相关阅读:
    统计学(第六版)14单元——学习总结
    统计学(第六版)13单元——学习总结(时间序列分析总结)
    统计学(第六版)11到12单元——学习总结
    Kubernetes: 微内核的分布式操作系统
    彻底搞懂JavaScript之原型
    手把手带你玩转k8s-一键部署vue项目
    新一代缓存Caffeine,速度确实比Guava的Cache快
    理解 Es6 中的 Symbol 类型
    一天一大 leet(用两个栈实现队列)难度:简单 DAY-30
    (Java 源码阅读) 春眠不觉晓,HashMap知多少
  • 原文地址:https://www.cnblogs.com/hanyinglong/p/3421115.html
Copyright © 2011-2022 走看看