应用程序域

    使用.Net建立的可执行程序*.exe,并没有直接承载到进程当中,而是承载到应用程序域(AppDomain)当中。应用程序域是.Net引入的一个新概念,它比进程所占用的资源要少,可以被看做是一个轻量级的进程。一个应用程序域可以有多个线程,一个线程也可以穿梭于多个应用程序域。

    那为什么会出现应用程序域呢?根据它的名字"域"我们可能会联想到域名,其实差不多就是这个概念了,ASP.NET通过这个应用程序域,主要的功能就是进行隔离.

     这样在不一个网站死掉的情况下,部署在IIS上的其他网站也不至于死掉.所有所它最重要的功能就是"隔离"

    下面来简单看看它的使用

  当需要在AppDomain加载可执行程序时,可以使用ExecuteAssembly方法。

  如,建一个控制台程序:

    class Program
{
static void Main(string[] args)
{
Console.WriteLine("供应用程序域执行!");
Console.ReadKey();
}
}

  将上面程序生成的路径保存到:C:\Users\ChenZhuo\Desktop\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe

  下面我们创建一个应用程序域并执行上面那个程序集:

    public class Program
{
static void Main(string[] args)
{
var domain = AppDomain.CreateDomain("MyAppDomain");
       //执行指定的程序集
domain.ExecuteAssembly(@"C:\Users\ChenZhuo\Desktop\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe");
Console.ReadKey();
}
}

  输出结果如下:

  

  需要注意的是如果需要卸载的话,只能把整个AppDomain卸载掉

 然后我们就来到了网站应用程序的大门

  也就是浏览器和ASP.NET的初次交涉,将请求封装成HttpWorkRequest对象,并通过HttpRuntime.ProcessRequest()这个方法传入封装对象来处理请求

    然后就得到了一个最最重要的对象HttpApplication 应用程序对象

  为什么说这个对象是最重要的呢?因为处理管道就在这个对象里面,由于HTTP连接的特性----------->无状态的短连接,所以我们的每一次请求都会创建一个HttpApplication

    对象,为了节省内存的开销,就有了一个HttpApplictionFactory的一个工厂对象来管理HttpApplication对象,同时还会生成一个混合对象HttpContext,

      为什么会有这个对象呢?就是为了方便我们进行管理,能用一个东西说明的就不用两个东西来说明!!!!

  然后呢,为了响应请求,ASP.NET需要很多很多的事情,于是就有了管道这个概念,

    管道:

      就是处理复杂问题的时候,将处理的过程分解为多个处理步骤,我们将这种经过多个步骤的处理方式称为处理管道

  自定义处理管道:
      继承自System.ComponentModel.Component
        有一个Events集合管理

简单的例子:

  class Handler:Component
{
private static readonly object startEvent = new object();
private static readonly object stopEvent = new object(); public event EventHandler StartProcess
{
add { this.Events.AddHandler(startEvent, value); }
remove { this.Events.RemoveHandler(startEvent, value); }
}
public event EventHandler StopProcess
{
add { this.Events.AddHandler(stopEvent, value); }
remove { this.Events.RemoveHandler(stopEvent, value); }
}
protected void OnStartProcess(EventArgs e)
{
if (this.Events[startEvent]!=null)
{
((EventHandler)this.Events[startEvent])(this, e);
}
}
protected void OnStopProcess(EventArgs e)
{
if (this.Events[stopEvent] != null)
{
((EventHandler)this.Events[stopEvent])(this, e);
}
}
public void Process()
{
OnStartProcess(EventArgs.Empty);
OnStopProcess(EventArgs.Empty);
}
}
        static void Main(string[] args)
{
Handler h = new Handler();
h.StartProcess += h_StartProcess;
h.StopProcess += h_StopProcess;
h.Process();
Console.Read();
} static void h_StopProcess(object sender, EventArgs e)
{
Console.WriteLine("停止处理......");
}
static void h_StartProcess(object sender, EventArgs e)
{
Console.WriteLine("开始处理.....");
}

  通过这个例子我们就可以看出来,管道可以通过事件暴露出来,也就是说我们可以自定义管道对应的处理方法,也就是过滤器,

    在ASP.NET中为了拓展管道的事件分别引入了下面两个类

      1.IHttpModule

      2.global.asax

    但是在这两个中来拓展的方法稍微有点不同,在IHttpModule   

//先看定义
public interface IHttpModule
{
void Dispose();
void Init(HttpApplication context);
}

  所有所我们应该这样来拓展

        public void Init(HttpApplication context)
{
// 下面是如何处理 LogRequest 事件并为其
// 提供自定义日志记录实现的示例
context.LogRequest += new EventHandler(OnLogRequest);
context.BeginRequest += context_BeginRequest;
}

  并在Web.config中配置这个模块

    <httpModules>
<add name="模块名称" type="命名空间.模块名称,程序集名称"/>
</httpModules>

  在 Global中就不是这样配置了,需要满足一定的要求

    1.Application_HttpModule中的方法
    2.满足System.EventHandler
    3.必须为public

然后我们就来到了处理管道,在这个管道中有19个处理事件,在这里就不详细的介绍了,我们只需要知道其中的几个重要的方法就可以了

    1.PostMapRequestHandler //找到对应的Handler

      那是通过什么样的机制来找到对应的处理程序?比较一个网站不可能只有一个页面,一个请求

        我们可以通过配置文件来配置,格式如下:

        在system.web配置元素的子元素httpHandlers来配置
            add
verb 通过一个逗号(,)分割的Http请求类型列表,例POST,GET,或者*代表全部
path 表示通过一个固定的URL路径或者一个使用星号(*)的通配符来匹配请求的URL,例如*.xu 代表处理所有后缀为xu的网页
type 处理程序的类型,格式为("命名空间.类名","程序集名称");
validate 如果设置为假,者在第一次匹配后,再不使用
removeclear
    那么为什么我们的一般处理程序*.ashx没有配置呢?是因为系统已经帮助我们定义了
      定义内容如下:
            <add
verb="*"
path="*.ashx"
type="System.web.UI.SimpleHandlerFactory"
validate=true
/>
          从上面这个配置节就可以看出来,拓展名为ashx的处理程序是被SimpleHandlerFactory进行管理的
SimpleHandlerFactory找到对应的ashx文件
通过反射得到类的实例
通过GetHandler返回实例给HttpApplication

    2.PostRequestHandlerExecute //执行Handler

    3.EndRequest        //结束请求

  当然一般情况下我们请求的都是一个后缀为*.aspx的不同页面,它也是一个处理程序,定义如下

            <add
verb="*"
path="*.aspx"
type="System.web.UI.PageHandlerFactory"
validate=true
/>
 那么页面是怎么生成的呢?我们知道一个HTML页面除了字符串还是字符串,那是不是我们生成的页面也都是字符串?
  那是当然了,这一切都是字符串.为了方便使用ASP.NET把对应的标签生成了一个一个对应的对象,这样即方便管理又可以重复使用.
  所有的控件都继承至Control包括Page
   下面我们来看一下他们的继承关系
  >Control
      >TemplateControl
        >Page
        >UserControl
      >WebControl
      >HtmlControl
        >CompositeControl
        >Panel
          >Part
            >WebPart
 从这个关系中我们就可以看出来Page和UserControl是基于模板产生的,但是想想也不觉得奇怪,毕竟一个Page承担了好多的东西
  然后控件又分为了服务器控件和Html控件,这个其中Html控件是静态的,服务端控件是动态的,当然在动态控件中的内容也是Literal对象
  既然有了模板,又有了控件,我们基本上就可以做出一个简单的网页了,可是这样并不能保存状态,于是为了保存状态,ASP.NET使用ViewState
    来保存对应对象的状态,具体的做法就是将对象序列化为二进制对象,但是网页不能有二进制对象,于是就把他转换成了Base64格式的字符串.
    然后放在网页中的隐藏域来进行保存,这样在我们回发请求的时候就会顺带的把这个隐藏域中的内容发送到服务端.然后回复上一次的状态.
     具体的做法如下:
      在页面的事件处理管道InitComplete 和PreLoad 之间做状态的恢复,然后再onLoad事件以后触发对象引发的事件
      然而加载和保存需要实现一个接口---->IStateManager
      public interface IStateManager
      {
        //表示控件是否使用视图状态
        bool IsTrackingViewState{get;}
        //管理视图状态的方法
        void LoadViewState(Object state);//从视图状态取回数据
        Object SaveViewState();//保存视图状态
        void TrackViewState();//开始使用视图状态
      }
    
       

ASP.NET 学习的总结的更多相关文章

  1. asp.net学习之Repeater控件

    asp.net学习之Repeater控件 文章摘自:http://www.cnblogs.com/shipfi/archive/2009/10/19/1585703.html Repeater控件和D ...

  2. 分享asp.net学习交流社区

    亲们 最近发现一个很好的asp.net学习交流的QQ群——237221223.爱好asp.net的亲们可以加入到大家庭中去哈.大家在一起交流学习

  3. asp.net学习资源汇总

    名称:快速入门地址:http://chs.gotdotnet.com/quickstart/描述:本站点是微软.NET技术的快速入门网站,我们不必再安装.NET Framework中的快速入门示例程序 ...

  4. asp.net学习之DataList控件

    asp.net学习之DataList控件   DataList控件与Repeater控件一样由模板驱动,与Repeater控件不同的是: DataList控件默认输出是一个HTML表格.DataLis ...

  5. asp.net学习之 数据绑定控件--List数据绑定控件

    原文:asp.net学习之 数据绑定控件--List数据绑定控件 List控件(如 CheckBoxList.DropDownList.ListBox 和 RadioButtonList 类)继承自L ...

  6. asp.net学习之数据绑定控件、数据源控件概述

    原文:asp.net学习之数据绑定控件.数据源控件概述 1.asp.net数据绑定控件分为三大类,每个类分别进行详细:      ● 列表式数据绑定控件: 列表式数据绑定控件常用来在一个表格内的一个字 ...

  7. asp.net学习之 数据绑定控件--表格绑定控件

    原文:asp.net学习之 数据绑定控件--表格绑定控件     数据绑定 Web 服务器控件是指可绑定到数据源控件,以实现在 Web 应用程序中轻松显示和修改数据的控件.数据绑定 Web 服务器控件 ...

  8. asp.net学习之GridView事件、GridViewRow对象

    原文:asp.net学习之GridView事件.GridViewRow对象 1. GridView控件的事件 GridView有很多事件,事件可以定制控件的外观或者行为.事件分为三类     1.1 ...

  9. asp.net学习之GridView七种字段

    原文:asp.net学习之GridView七种字段 asp.net中GridView绑定到数据源时,可以自动显示数据源的各个字段.只要设定其AutoGenerateColumns为TRUE即可.但这, ...

  10. asp.net学习之再论sqlDataSource

    原文:asp.net学习之再论sqlDataSource 本节从上一节没有阐述的几个方面,再讨论一下SqlDataSource的用法及注意的事项.     上一节的链接地址如下:http://www. ...

随机推荐

  1. http连接

    一.http over tcp over ip

  2. grep 同时满足多个关键字和满足任意关键字

    grep 同时满足多个关键字和满足任意关键字 ① grep -E "word1|word2|word3"   file.txt    满足任意条件(word1.word2和word ...

  3. poj 3259 Wormholes(最短路 Bellman)

    题目:http://poj.org/problem?id=3259 题意:一个famer有一些农场,这些农场里面有一些田地,田地里面有一些虫洞,田地和田地之间有路,虫洞有这样的性质: 时间倒流.问你这 ...

  4. JavaScript NodeList和Array

    原文引用脚本之家作者:Jeff Wong,谢谢大神提供资源 在Web前端编程中,我们通常会通过document.getElementsByTagName或者document.getElementsBy ...

  5. UVa 140 (枚举排列) Bandwidth

    题意较复杂,请参见原题=_=|| 没什么好说的,直接枚举每个排列就好了,然后记录最小带宽,以及对应的最佳排列. STL里的next_permutation函数真是好用. 比较蛋疼的就是题目的输入了.. ...

  6. Shell Script Tutorials (0 ~ 62)

    Tutorial-1: Introduction Tutorial-2: Shell, Kernel, Terminal & More Tutorial-3: View System Date ...

  7. textview的上下滑动效果

    1.xml文件中 <TextView    …    android:scrollbars="vertical"  ../> 2.java文件中 textview.se ...

  8. 【转】特斯拉CEO马斯克:关于创业的几件重要事情

    特斯拉电动汽车联合创始人兼CEO,私人太空发射公司SpaceX CEO伊隆马斯克(Elon Musk)于5月16日在南加大商学院毕业典礼上发表演讲,他谈到了关于创业的几件重要的事情:一是努力工作;二是 ...

  9. 我的WCF之旅(1):创建一个简单的WCF程序

    为了使读者对基于WCF的编程模型有一个直观的映像,我将带领读者一步一步地创建一个完整的WCF应用.本应用功能虽然简单,但它涵盖了一个完整WCF应用的基本结构.对那些对WCF不是很了解的读者来说,这个例 ...

  10. 上传文件出错:org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly

    最近做一个web项目中有上传文件的功能,已经写出并在本地和部署到服务器上测试了好几个文件上传都没问题(我用的是tomcat).后来又上传了一个700多K的文件(前边的都是不足600K的,并且这个wor ...