通过初步浏览全部代码之后,我们大致上明白了:
1 、执行流。 asp.net 程序具体是如何执行的?一个 asp.net 的应用程序的执行首先是需要一个宿主,通过建立宿主后,就建立了执行 asp.net 应用代码的能力。执行一次 asp.net 请求,需要通过 HttpRuntime.ProcessRequest(SimpleWorkerRequest) 来激发执行,而 SimpleWorkerRequest 需要被重载,将一次完整的 http request 实例化,并提供给 asp.net 运行库以便正确处理用户请求上下文关系以及用户请求数据。 SimpleWorkerRequest 被重载的函数在 asp.net 的执行过程中按照 http 协议的规范被依次调用。
2 、 HTTP 协议细节。我们实际上并没有看到完整的 http server 的执行细节,因为具体的 http 请求执行是 asp.net 运行库执行的(通过 HttpRuntime.ProcessRequest ),包括 .htm 之类的文件都是被运行库执行的,只不过运行库发现不需要执行就直接读取文件返回。这个同 IIS 下的 asp.net 执行不一样, IIS 自己会在 asp_WP.exe 之前处理自己注册的扩展名文件请求。这个结果可能一样,但是实质不一样,就是普通文件处理位置不一样。所以,我们可以在 cassini 基础之上自行处理部分属于不需要动态解析的文件,减轻 asp.net 运行库的负担,提高效率。
Cassini 是一个 asp.net 的宿主程序,并非完整的 web server 。
3 、 asp.net 是一个全新的执行环境,并非脚本之前的脚本技术, .net 自身除了基础框架外,还提供了执行 aspx 页面的能力和相应组件。学习 cassini 就是学习如何使用 .net 框架提供的这种能力。就类似你研读 c 代码学习利用 windows api 编程一样。
4 、我们可以选择 IIS 作为宿主,但是 ISAPI 启动 asp.net 守护进程之后通过管道传回响应毕竟是在两个进程间传输数据,况且, IIS 自身也是漏洞一大筐,没有其他需要,我们认为还是自己实现 asp.net 宿主并执行 asp.net 应用程序在效率上要高,况且应用程序域也提供了安全隔离。
5 、学习如何使用多线程来满足多线程企业应用,回调函数的使用也是精巧。
6 、对于自己将来实现独立于 IIS 的 web 应用开发有意义,譬如,可以采用 asp.net 开发方式开发桌面辅助应用。类似于 HTMLView 应用。我看到有人通过自己执行 asp.net 来快速产生界面运行桌面应用(方便将来迅速扩展到多用户)。
当然,我自身也有疑问:
1、 为什么采用 ThreadPool ,会不会导致并发访问阻塞?
2、 可否更多的利用自己创建独立的 asp.net 执行宿主?
3、 如何更通用化产生一个这样的工具,我相信可以更加独立化的。
欢迎联系我 [email protected] 。