Назад | Перейти на главную страницу

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 настройки не применяются к папке приложения? Или какой-нибудь другой трюк, о котором я не подумал?

Система работает под управлением IIS7 на Windows Server 2008 64bit, я полностью контролирую конфигурацию сервера.

Я не могу изменить исходный код блога, но могу отредактировать его web.config и другая конфигурация.

Я могу изменить исходный код нового приложения, но не могу сделать его совместимым с блогом (большая часть его полезности происходит из сторонней библиотеки, несовместимой с блогом).

Блог в приложении веб-форм asp.net 3.5

Новое корневое приложение - это приложение asp.net 4.0 mvc.

Вы можете отредактировать файл web.config программного обеспечения блога вручную или с помощью инструмента «Internet Information Services (IIS) Manager», чтобы отключить различные модули и обработчики по мере необходимости. Например, чтобы удалить один обработчик и один модуль, которые установлены и доступны по умолчанию в 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], либо используйте ссылку «Удалить» под действиями, либо щелкните правой кнопкой мыши и выберите «Удалить» в контекстном меню.

Вы можете создать новое приложение для этой конкретной папки в ее окне «Свойства», на вкладке «Домашний каталог» (или «Виртуальный каталог для виртуально созданных каталогов»). Я думаю, вам нужен домашний каталог для обновленного нового содержимого .net. После того, как вы настроите для него веб-сайт, перейдите в папку блога и создайте для него приложение. Затем перейдите на вкладку ASP.NET и исправьте версию приложения, потому что при настройке родительского веб-сайта для версии 4.0 версия блога также изменится на эту. Вы должны изменить его обратно на v3.5

Как уже упоминалось, каждое приложение будет иметь свой собственный файл web.config, поэтому два разных приложения не будут пересекаться друг с другом.

Я не думаю, что это возможно, пока каталоги физически вложены. Наверное, самый простой способ - использовать инструменты 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 или Маршрутизация запросов приложений выстрел.