![]()
CASSINI 源代码分析
(1)
2004-11-10
为什么要分析 CASSINI?
Cassini (卡西尼)是 asp.net 上的一个开源项目。主要给出一个脱离 IIS 实现 asp.net 执行环境。项目演示了如何自己创建一个 web server ,并且运行一个 asp.net 应用程序。
研究 Cassini 可以了解:
1 、 .net 环境下的 web server 如何实现,注意那些问题
2 、 asp.net 的执行本质
3 、了解 appDomain 的执行概念
安装
没有什么问题,默认即可
运行
出现问题,主要是我的 .net framework 是 1.0.3705 而 系统下载的经过编译的 cassini.dll 是在 v1.1.4322 下编译,更麻烦的是经过签名的。所以启动时候回提示找不到 v1.1.4322 的 framework
而我的目标是想分析这个程序,该如何进行?
既然获得了整个源代码,我就应该从理论上熟悉并且可以掌握整个系统,我建立一个工程,将全部 .cs 文件和资源文件加入到一个项目,同时删除原有项目默认的 form1 ,因为 CassiniWebServer.cs 已经有一个 main 入口。
调试,解决问题
1、 编译 OK ,但是,无法启动,原来缺少 .ico 文件。不是已经加入到工程了么?原来,我们的编译程序在 bin\debug 目录下,所以我将 CassiniWebServer..ico 文件拷贝到 bin\debug\ 下即可启动
2、 输入 asp.net 应用程序根目录、端口、执行点, OK ,点击 Start ,出现错误,好像告知我端口被占用。不可能!我的 80 端口 8080 端口都没有被占用,难道是有木马?我用 fport.exe 查询端口,发现根本没有程序占用。那究竟是什么原因?好在可以启动进行调试,我跟踪到 CassiniWebServer.cs 的 CassiniForm 类的 Start() 函数,发现在以下代码处发生错误
try {
_server = new Cassini.Server(portNumber, _virtRoot, _appPath);
_server.Start();
}
catch {
ShowError(
"Cassini Managed Web Server failed to start listening on port " + portNumber + ".\r\n" +
"Possible conflict with another Web Server on the same port.");
portTextBox.SelectAll();
portTextBox.Focus();
return;
} 也就是在创建 server 的时候出错。
但是不利的是,源代码并未交待错误原因,而是武断的告诉我“ Cassini Managed Web Server failed to start listening on port XXX ”,显然,是不慎重的(估计作者对 Exception 不感冒)。
为了深入了解原因,我加入了
catch (Exception e){
MessageBox.Show(e.ToString());
……
这样,就显示了一个错误提示。原来是,在 asp.net 的创建应用域需要用到的程序集在私有目录或者 GAC 中。之前安装后,看到 .snk 证书文件就是为了签名加密并拷贝到全局 dll 中的。但是我没有这样做,所以 CLR 会在启动进程的当前目录的子目录 bin\ 下寻找需要的程序集。而我将原本是两个程序集的源码集合到一个程序集,导致执行搜索程序集失败。直到原因后,建立 bin 目录,并拷贝编译后的 exe 文件到 asp.net 的执行起点的 bin 目录后,系统启动 OK.
3、 测试,通过 ie 测试访问,发现一切正常,就好像在 IIS 下运行一样。
(待续)