IIS7 - 如何将应用程序放置在应用程序网站内的文件夹中

IIS7 - 如何将应用程序放置在应用程序网站内的文件夹中

我有一个带有博客的静态网站(一个 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 管理器执行此操作的步骤如下:

  1. 打开 IIS 管理器并连接到您要配置的计算机
  2. 在左侧的树视图中,向下导航到要配置的应用程序
  3. 在主窗格中选择“处理程序映射”或“模块”
  4. 单击要删除的每个处理程序或模块,然后单击 [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);
  }
}

但我必须承认,这是我能想到的最可疑的解决方案:-) 我建议你先给URL 重写或者应用程序请求路由一枪。

相关内容