新多站点 DLL 或如何在根目录开发 .NET 项目






3.45/5 (12投票s)
2005年3月7日
5分钟阅读

100459

759
简化 .NET 开发的实用程序。
引言
您可能多少次希望您可以在根文件夹中开发 .NET 项目或在 Win XP 上托管多个网站。如果至少有一次,请继续阅读。
在根目录开发的难题在于 VS 实际上并不真正支持这一点(尽管可以实现)。另外,我经常处理多个项目,或者只是想将项目放在自己的文件夹中,以便在需要时可以轻松地进行调试/修改,而不会弄乱所有其他项目。
解决方案
我偶然发现了 multisite.dll(可能非常有名),它可以将不同的主机名映射到不同的 URL。因此,我可以设置 www.project1.com 到 /project1 文件夹,www.project2.com 到 /project2 文件夹… 但这个 DLL 不适用于 .NET。它唯一能很好地工作的只是简单的 HTML,这基本上使其毫无价值。
但这让我感到好奇,是什么阻止了它与 .NET 配合使用。在阅读了一些关于 ISAPI 的文档后,我发现问题在于它如何处理请求。
当浏览器访问 IIS 并请求 http://www.project1.com/default.aspx 时,IIS会将 URL“/default.aspx”转换为物理路径“C:\inetpub\wwwRoot\default.aspx”。只有这样,DLL 才会介入请求,并将物理路径修改为正确的路径“C:\inetpub\wwwRoot\project1\default.aspx”。ASP.NET 应用程序首先要做的就是检查根文件夹中的 web.config 和 global.asax,由于 URL 未更改,ASP.NET 会在“\”文件夹中查找这些文件,而不是在“\project1”文件夹中,从而跳过了加载 config.asax 或 web.config,使得使用该版本的 Multisite.dll 进行任何严肃的项目开发都变得无用。
在我意识到这一点后,我明白解决方案是修改 URL 而不是物理路径。仔细阅读文档后,我发现 SF_NOTIFY_PREPROC_HEADERS
结合 GetHeader
、SetHeader
可以完全实现我需要的功能。
- 浏览器访问 IIS 时请求 http://www.project1.com/default.aspx
- DLL 将其修改为 http://www.project1.com/project1/default.aspx。
其他一切都与从一开始就请求 URL http://www.project1.com/project1/default.aspx 相同。ASP.NET 找到正确的 global.asax 和 web.config,并且在不知道进行了修改的情况下正常工作。
实现新的多站点 DLL
- 此步骤仅在安装我的 multisite.dll 时需要执行一次。将 multisite.dll 和 config.ini 复制到某个文件夹,然后将其作为 ISAPI 过滤器注册到 IIS。
- 假设您有一个 .NET 项目。假设是 Project1。您希望它位于 www.mysite.com。
- 修改 C:\WINDOWS\system32\drivers\etc 中的 HOSTS 文件。添加新的一行
127.0.0.1 www.mysite.com
- 修改 mulitsite.dll 所在文件夹中的 config.ini。添加新的一行
mysite.com = /Project1
注意,不是 www.。因为 www. 会被自动剥离,所以它像真实世界一样工作。
- 重新启动 IIS 服务器。之后,每次您请求 http://www.mysite.com/mypage.aspx 时,URL 都将被转换为 http://www.mysite.com/project1/mypage.aspx,一切都会正常工作。项目完成后,您只需将其全部复制到生产网站的根文件夹即可。无需修改。
重要说明
- 安全地假设您的项目从根目录运行,这样所有图像、CSS 文件、JS 文件都可以从根目录引用。无需添加项目名称,然后迁移到生产环境时重命名所有这些文件。
- 在可能的情况下,在
Response.Redirect("~/mypage.aspx")
或Response.Redirect("/mypage.aspx")
等构造中使用根目录“/”或“~”符号。不要使用项目名称。构造Response.Redirect("~/mypage.aspx")
将被翻译成Response.Redirect("/project1/mypage.aspx")
。因此,多站点 DLL 不会修改路径。也就是说,www.mysite.com/project1/mypage.aspx 的路径将不会被触及,并会原封不动地传递给 IIS。(这里的关键是 URL 中的第一个文件夹与映射文件夹匹配)。 - 在当前实现中,您需要重新启动 IIS 才能加载 config.ini 中的所有更改。
- 调试完全受支持,但因为当您在 Visual Studio 中按 F5 时,它会打开 https:///....。您需要将 localhost 映射到 /Project1,或者有一个单独的浏览器窗口指向 http://www.mysite.com/.. 并在那里进行所有测试。选择哪种方式取决于您,但如果您映射了 localhost,请不要忘记取消映射它。否则,您将无法访问 Project1 文件夹之外的 IIS 上的任何其他文件。
- 在 config.ini 中,项目文件夹以“/”符号开头至关重要。
- 不要在 config.ini 中为名称加上 www. 前缀。www. 会从请求中剥离,使其像真实 Web 应用程序一样工作。如果您想要 www. 和非 www. 版本的运行站点,您需要在 host 文件中添加两行。一行用于 www. 名称,另一行不带 www. 名称!
结论
我发现这个小程序在我的开发工作中非常有用。我可以在开发机器上运行所有项目,并在需要时轻松修改并上传到生产服务器。无需运行“全部替换”来删除项目名称。
另外,它在我的生产服务器 Ms.Piercing 上非常方便,我在那里有多个网站,而不是使用 IIS 运行多个 WWW 实例的功能,我正在使用我的 DLL 来完成这项工作(在我看来,它更轻量级)。
如果您对这个 DLL 有任何疑问,请随时发送电子邮件给我(删除 nospam)或访问我的 网站。我计划撰写下一个版本,该版本将不再需要每次修改 config.ini 时都重新启动 IIS。