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类创建新的应用程序域的过程:
private static void Main(string[] args)
{
Type hostType = typeof (Intelligencer);
Intelligencer intelligencer =
System.Web.Hosting.ApplicationHost.CreateApplicationHost(hostType, "/",
System.Environment.CurrentDirectory) as
Intelligencer;
Console.WriteLine("Current Domian ID:{0}\r\n", AppDomain.CurrentDomain.Id);
Console.WriteLine(intelligencer.Report());
Console.ReadLine();
}
public class Intelligencer : MarshalByRefObject
{
public string Report()
{
AppDomain appDomain = AppDomain.CurrentDomain;
StringBuilder builder = new StringBuilder();
//应用程序域的信息
builder.AppendFormat("Domain ID:{0}\r\n", appDomain.Id);
//对于每一个Web应用程序域,有一个HostingEncironment
builder.AppendFormat("VirtualPath:{0}\r\n", HostingEnvironment.ApplicationVirtualPath);
builder.AppendFormat("PhysicalPath:{0}\r\n", HostingEnvironment.ApplicationPhysicalPath);
return builder.ToString();
}
}
3.不使用GAC和bin加载Web应用程序域
使用ApplicationHost创建应用程序域有一点麻烦的地方在于,必须将程序集注册到GAC中,或者复制到bin文件夹下,在Cassini项目中提供了一种可以在单个超过您续重实现的方式,代码如下:
private static object CreateWorkerAppDomianWithHost(string virtualPath, string physicalPath, Type hostType)
{
//通过反射使用私有的BuildMangeHost类型,这种方式创建web应用程序域,不需程序集注册到GAC或者放置到bin文件夹
//唯一的应用程序名
string uniqueAppString = string.Concat(virtualPath, physicalPath.ToLowerInvariant());
//获取唯一的Id
string appId = (uniqueAppString.GetHashCode()).ToString("x");
//在Web应用程序域中创建BuildManagerHost
var appManager = ApplicationManager.GetApplicationManager();
//System.Web.Compilation.BuildMangerHost是一个内部类,不能再CSDN查到
var buildManagerHostType = typeof (HttpRuntime).Assembly.GetType("System.Web.Compilation.BuildMangerHos");
//为应用程序域创建对象
var buildManagerHost = appManager.CreateObject(appId, buildManagerHostType, virtualPath, physicalPath, false);
//调用BuildManagerHost.RegisterAssembly方法将类型注册到应用程序域
buildManagerHostType.InvokeMember("RegisterAssembly",
BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.NonPublic,
null, buildManagerHost, new object[]
{
hostType.Assembly.FullName,
hostType.Assembly.Location
});
//现在可以使用类型创建对象实例
return appManager.CreateObject(appId, hostType, virtualPath, physicalPath, false);
}
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就开始服务器的请求处理任务了。
ASP.NET本质论第一章网站应用程序学习笔记2的更多相关文章
- ASP.NET本质论第一章网站应用程序学习笔记3-对象化的Http
在.NET环境下,万物皆对象,在HttpRuntime收到请求之后,立即将通过HttpWorkerRequest传递的参数进行分析和分解,创建方便用于网站应用程序处理用的对象,其中主要涉及到两个对象类 ...
- ASP.NET本质论第一章网站应用程序学习笔记1
1.统一资源标示符 1) 格式:协议://主机[.端口号][绝对路径[?参数]],在Http://www.kencery.com/hyl/index/login中,http表示协议的名称,www.ke ...
- ASP.NET本质论第二章应用程序对象学习笔记1
1.请求的处理参数—上下文对象HttpContext 1) 针对每一次请求,ASP.NET将创建一个处理这次请求所使用的HttpContext对象实例,这个对象实例将用来在ASP.NET服务器的处理过 ...
- 0001-20180421-自动化第一章-python基础学习笔记
======================学习python==================介绍: python种类: cpython(*),jpython,ironpython,rubypyth ...
- 01.第一章_C++ Primer学习笔记_开始
1.2 初始输入输出 iostream库里面包含两个基础类型istream和ostream,分别表示输入流和输出流,一个流就是一个字符序列,从IO设备读出或者写入IO设备. 标准的输入输出对象 标准库 ...
- C语言编程入门之--第一章初识程序
第一章 初识程序 导读:计算机程序无时不刻的影响着人类的生活,现代社会已经离不开程序,程序的作用如此巨大,那么程序到底是什么呢?本章主要讨论程序的概念,唤起读者对程序的兴趣,同时对C语言程序与其它语言 ...
- 《算法》第一章部分程序 part 2
▶ 书中第一章部分程序,加上自己补充的代码,包括简单的计时器,链表背包迭代器,表达式计算相关 ● 简单的计时器,分别记录墙上时间和 CPU 时间. package package01; import ...
- 《算法》第一章部分程序 part 1
▶ 书中第一章部分程序,加上自己补充的代码,包括若干种二分搜索,寻找图上连通分量数的两种算法 ● 代码,二分搜索 package package01; import java.util.Arrays; ...
- windows核心编程-第一章 对程序错误的处理
第一章-对程序错误的处理 在开始介绍Microsoft Windows 的特性之前,必须首先了解 Wi n d o w s的各个函数是如何进行错误处理的. 当调用一个Wi n d o w s函数时,它 ...
随机推荐
- sloth——算法工程师标注数据的福音
一般算法工程师做标注,都要先开发个标注工具,无非下面几个选项: 1.mfc,C#,优点是交互界面友好,开发难度适中,缺点是没法跨平台 2.matlab,优点是可以跨平台,开发难度非常低,缺点是速度慢. ...
- [LeetCode] Longest Valid Parentheses 动态规划
Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...
- Java知多少(105)套接字(Socket)
网络应用模式主要有: 主机/终端模式:集中计算,集中管理: 客户机/服务器(Client/Server,简称C/S)模式:分布计算,分布管理: 浏览器/服务器模式:利用Internet跨平台. www ...
- SpringMVC Controller 返回值的可选类型
spring mvc 支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void. ModelAndView @RequestMap ...
- PE渲染引擎 一
PE是我业余时间做的一个纯dx11的渲染框架.主要就是练手.如果有时间,会把它“扩展”成真正的引擎(标配至少要有个对应的编辑器吧 -_!!). 目前实现的有: obj文件加载,binormal计算. ...
- C#生成不重复的随机数(转)
我们在做能自动生成试卷的考试系统时,常常需要随机生成一组不重复随机数的题目,在.net Framework中提供了一个专门用来产生随机数的类System.Random. 对于随机数,大家都知道,计算机 ...
- Nginx--Windows环境下Nginx+tomcat配置(包括动静分离)
前提条件: (1)已安装好tomcat,且能成功启动 (2)已安装好Nginx,且能成功启动 接下来进行配置: (1)在Nginx的conf文件夹中新增两个文件,分别如下:(新建文件后,直接复制代码即 ...
- [OpenCV] IplImage and Functions
In this chapter, APIs will make U crazy. Good luck! Next, Review Linear Algebra. Ref: http://blog.c ...
- linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例 --转载
http://www.cnblogs.com/chengmo/archive/2010/10/14/1851434.html nux shell有一套自己的流程控制语句,其中包括条件语句(if),循环 ...
- 移除了css框架,世界干净了
在之前的webapp项目里,我使用了bootstrap作为三方的css库,只调取了其中一部分源码的less使用,大部分代码仍然是自己写的. 自己的代码也是参照bootstrap的目录结构和它的一些规范 ...