我有一个博客(一个asp.net应用程序)的静态网站,博客是在网站的子目录中,所以:
example.com/等 – 都是静态文件
example.com/blog等 – 全部转到博客应用
我正在将网站的静态部分升级到dynamic网站(也是一个asp.net应用程序),并且该博客与新应用程序不兼容(该应用程序需要在web.config中加载的处理程序和模块,博客)
此外,我必须保持所有的旧url相同 – 所以我不能将博客移动到一个子域或新的应用程序到一个文件夹和博客生成基于其文件夹的链接,所以聪明的redirect技巧将无法正常工作。
有没有办法将asp.net应用程序放置在另一个应用程序(作为实际或虚拟文件夹)的文件夹中,以便根web.config设置不适用于应用程序文件夹? 或者我没有想到的其他一些技巧?
系统在Windows Server 2008 64位上运行IIS7,我完全控制了服务器的configuration。
我无法修改博客的源代码,但我可以编辑其web.config和其他configuration。
我可以修改新应用程序的源代码,但是我不能使其与博客兼容(其大部分实用性来自与博客不兼容的第三方库)。
在一个asp.net 3.5 webforms应用程序的博客
新的根应用程序是一个asp.net 4.0 mvc应用程序
您可以手动编辑博客软件的web.config文件,也可以通过“Internet信息服务(IIS)pipe理器”工具根据需要禁用各种模块和处理程序。 例如,要删除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>
您应该能够“插入”问题模块和处理程序的名称,博客软件将再次开始工作。
通过IISpipe理器执行此操作的步骤是:
您可以在其“属性”窗口“主目录”(或“虚拟目录”虚拟创build的目录)选项卡下为该特定文件夹创build新的应用程序。 我想你想要主目录更新新的.NET内容。 configuration网站后,它进入博客文件夹,并为其创build一个应用程序。 然后转到ASP.NET选项卡,并更正应用程序版本,因为当您configurationv4.0的父网站时,博客的版本也将更改为。 你应该改回到v3.5
被提到,每个应用程序将有自己的web.config文件,所以两个不同的应用程序将不会相互交叉..
我不认为这是可能的目录是物理嵌套。 可能最简单的方法是使用IIS工具URL重写或应用程序请求路由 。
使用ASP路由的东西可能不会工作,因为应用程序需要在自己的领域。
如果你真的想避免使用IIS的东西,你可以让你的新的MVC应用程序作为代理工作,并从博客控制调用其他应用程序,并返回结果。 然后你也必须考虑到你的博客应用程序生成链接与URL的使用代码是这样的:
ResolveUrl("~/...")
您需要search并replace这些URL(未经testing,您需要调整一些东西以使其正常工作,但是可以提取基本想法):
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); } }
但我必须承认,这是我能想到的最可骇的解决scheme:-)我build议您先给URL重写或应用程序请求路由一个镜头。