我有一个带有博客的静态网站(一个 asp.net 应用程序),该博客位于网站的子目录中,因此:
example.com/
、、、等 - 都是静态example.com/Something.htm
文件example.com/folder/somefile.htm
example.com/blog
、、、等等 -example.com/blog/categories.aspx
全部example.com/blog/2011/11/09/post-name.aspx
转到博客应用程序
我正在将网站的静态部分升级为动态网站(也是一个 asp.net 应用程序),但博客与新应用程序不兼容(应用程序需要加载与web.config
博客不兼容的处理程序和模块)
此外,我必须保留所有旧的 URL 不变 - 所以我不能将博客移动到子域或将新应用程序移动到文件夹,并且博客会根据其文件夹生成链接,因此巧妙的重定向技巧将不起作用。
有没有办法将 asp.net 应用程序放在另一个应用程序内的文件夹中(无论是真实文件夹还是虚拟文件夹),以便根web.config
设置不适用于该应用程序文件夹?或者还有其他我没有想到的技巧?
该系统在 Windows Server 2008 64 位上运行 IIS7,我可以完全控制服务器的配置。
我无法修改博客的源代码,但我可以编辑它web.config
和其他配置。
我可以修改新应用程序的源代码,但无法使其与博客兼容(其大部分实用性来自与博客不兼容的第三方库)。
asp.net 3.5 webforms 应用程序中的博客
新的根应用程序是 asp.net 4.0 mvc 应用程序
答案1
您可以手动或通过“Internet 信息服务 (IIS) 管理器”工具编辑博客软件的 web.config 文件,以根据需要禁用各种模块和处理程序。例如,要删除 IIS 7.5 中默认安装并可用的一个处理程序和一个模块:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<modules>
<remove name="Session" />
</modules>
<handlers>
<remove name="StaticFile" />
</handlers>
</system.webServer>
</configuration>
您应该能够只“放入”问题模块和处理程序的名称,然后博客软件就会重新开始工作。
通过 IIS 管理器执行此操作的步骤如下:
- 打开 IIS 管理器并连接到您要配置的计算机
- 在左侧的树视图中,向下导航到要配置的应用程序
- 在主窗格中选择“处理程序映射”或“模块”
- 单击要删除的每个处理程序或模块,然后单击 [DEL],使用操作下的“删除”链接,或右键单击并从上下文菜单中选择“删除”。
答案2
您可以在特定文件夹的“属性”窗口的“主目录”(或虚拟目录,用于虚拟创建的目录)选项卡下为该文件夹创建新的应用程序。我猜您想要更新的新 .net 内容的主目录。为其配置网站后,转到博客文件夹并为其创建一个应用程序。然后转到 ASP.NET 选项卡并更正应用程序版本,因为当您为 v4.0 配置父网站时,博客的版本也会更改为该版本。您应该将其改回 v3.5
如上所述,每个应用程序都有自己的 web.config 文件,因此两个不同的应用程序不会相互交叉。
答案3
我认为当目录物理嵌套时这是不可能的。最简单的方法可能是使用 IIS 工具URL 重写或者应用程序请求路由。
使用ASP 路由由于应用程序需要位于它自己的域中,所以某些东西可能无法工作。
如果您确实想避免使用 IIS 内容,您可以让新的 MVC 应用程序作为代理,从 Blog 控件调用其他应用程序并返回结果。然后,您还必须考虑您的博客应用程序何时使用如下代码生成带有 url 的链接:
ResolveUrl("~/...")
您需要搜索并替换这些 URL(未经测试,您需要在这里调整一些内容才能使其正常工作,但可以提取基本思想):
public class BlogController : Controller {
protected override void HandleUnknownAction(string actionName) {
string newUrl = ConvertToNewUrl(Request.Url);
System.Net.HttpWebRequest newRequest = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(newUrl);
System.Net.HttpWebResponse newResponse = (System.Net.HttpWebResponse)newRequest.GetResponse();
System.IO.Stream resStream = newResponse.GetResponseStream();
byte[] content = new byte[resStream.Length];
resStream.Read(content, 0, (int)resStream.Length);
if (newResponse.ContentType == "text/html") {
System.IO.MemoryStream ms = new System.IO.MemoryStream(content);
using (System.IO.StreamReader sr = new System.IO.StreamReader(ms)) {
string strContent = sr.ReadToEnd();
strContent = strContent.Replace("example.com/something", "example.com/blog");
using (ms = new System.IO.MemoryStream()) {
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(ms)) {
sw.Write(strContent);
content = ms.ToArray();
}
}
}
}
Response.Write(content);
}
}