IIS7 перенаправление между виртуальными каталогами - PullRequest
1 голос
/ 21 апреля 2011

в нашем приложении asp.net у нас есть несколько виртуальных каталогов. В IIS7 они называются «приложениями», и все они имеют один и тот же пул приложений, работающий в классическом конвейерном режиме.

  • www.webapp.com / example1
  • www.webapp.com / example2
  • и т.д.

Все они указывают на один и тот же физический каталог, скажем C: \ webapp. Единственное отличие состоит в том, что каждый из них имеет базовый виртуальный каталог, который указывает на другую папку CSS, которая находится в C: \ webapp \ styles \ (например, C: \ webapp \ styles \ example1 \ base.css и т. Д.)

Мы используем проверку подлинности на основе форм и встроенного поставщика членства. Проблема, которую мы имеем, заключается в следующем:

Когда пользователь просматривает www.webapp.com/example1/page.aspx и щелкает ссылку, которая перенаправляет на www.webapp.com/example2/otherpage.aspx, пользователь вместо этого перенаправляется на www.webapp.com /example2/login.aspx. Кажется, что сессия истекла.

Мы действительно не знаем, где искать решение, любые указатели очень ценятся! Заранее спасибо! Стейн

1 Ответ

1 голос
/ 26 апреля 2011

Мы нашли решение, поэтому я решил поделиться этим с SO-сообществом:

установить для AppDomainAppId фиксированное значение (в данном случае applicationName) через отражение:

Globals.asax.cs:

    protected void Application_Start(object sender, EventArgs e)
    {
        // make sure all set the same AppDomainAppId
        FieldInfo runtimeInfo = typeof(HttpRuntime).GetField("_theRuntime", BindingFlags.Static | BindingFlags.NonPublic);
        if (runtimeInfo == null) return;
        HttpRuntime theRuntime = (HttpRuntime)runtimeInfo.GetValue(null);
        if (theRuntime == null) return;
        FieldInfo appNameInfo = typeof(HttpRuntime).GetField("_appDomainAppId", BindingFlags.Instance | BindingFlags.NonPublic);
        if (appNameInfo == null) return;
        var appName = (String)appNameInfo.GetValue(theRuntime);
        if (appName != "applicationName") appNameInfo.SetValue(theRuntime, "applicationName");
    }
...