Менять корень приложения ASP.net? - PullRequest
6 голосов
/ 04 декабря 2010

Итак, ASP.net имеет понятие «корень приложения». Это часть пути URL, которая соответствует корневому каталогу, установленному для приложения в IIS. Символ тильды (~) сопоставляется с этим путем в URL-адресах ASP.net, поэтому, если ASP.net считает, что мое приложение находится в / MyApp, что-то в серверном элементе управления, чей URL-адрес, указанный в «~ / Scripts / script.js», будет разрешен (и отправлять в браузер как) "/MyApp/Scripts/script.js".

Это длинный путь, но есть ли способ, которым я могу произвольно изменить root этого приложения? На самом деле у меня есть приложение в каталоге под другим, и я использую переписывание URL, чтобы сделать его доступным без префикса имени каталога, но ASP.net всегда в любом случае использует префикс имени dir везде, где я использую ~. Я действительно хочу разрешить пустую строку. Можно ли это сделать?

Ответы [ 3 ]

6 голосов
/ 09 декабря 2010

Вы должны иметь возможность изменить семантику того, на что отображается карта, написав собственный VirtualPathProvider. Вот как это может выглядеть. Я проверил это на простом случае, но, вероятно, он нуждается в полировке.

Я предлагаю вам поиграть с ним в простом тестовом приложении, прежде чем переходить к реальному сценарию. Это облегчит выделение проблем и их повторение.

using System;
using System.Collections;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Caching;
using System.Web.Hosting;

public class TildeModifyingVPP : VirtualPathProvider {

    // Change this to what you want ~ to map to
    private const string PseudoRoot = "~/PseudoAppRoot/";

    public static void AppInitialize() {
        HostingEnvironment.RegisterVirtualPathProvider(new TildeModifyingVPP());
    }

    private string ResolvePath(string virtualPath) {
        // Make it app relative, i.e. ~/...
        virtualPath = VirtualPathUtility.ToAppRelative(virtualPath);

        // Change the ~/ to our pseudo root
        return PseudoRoot + virtualPath.Substring(2);
    }

    public override bool FileExists(string virtualPath) {
        return base.FileExists(ResolvePath(virtualPath));
    }

    public override VirtualFile GetFile(string virtualPath) {
        return new DelegatingVirtualFile(virtualPath, base.GetFile(ResolvePath(virtualPath)));
    }

    public override bool DirectoryExists(string virtualDir) {
        return base.DirectoryExists(ResolvePath(virtualDir));
    }

    public override VirtualDirectory GetDirectory(string virtualDir) {
        return new DelegatingVirtualDirectory(virtualDir, base.GetDirectory(ResolvePath(virtualDir)));
    }

    public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) {
        virtualPathDependencies = virtualPathDependencies.Cast<string>().Select(vpath => ResolvePath(vpath));
        return base.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
    }
}

class DelegatingVirtualFile : VirtualFile {
    private VirtualFile _underlyingFile;
    public DelegatingVirtualFile(string virtualPath, VirtualFile underlyingFile): base(virtualPath) {
        _underlyingFile = underlyingFile;
    }

    public override Stream Open() {
        return _underlyingFile.Open();
    }
}

class DelegatingVirtualDirectory : VirtualDirectory {
    private VirtualDirectory _underlyingDir;
    public DelegatingVirtualDirectory(string virtualPath, VirtualDirectory underlyingDir)
        : base(virtualPath) {
        _underlyingDir = underlyingDir;
    }

    public override IEnumerable Children { get { return _underlyingDir.Children; } }
    public override IEnumerable Directories { get { return _underlyingDir.Directories; } }
    public override IEnumerable Files { get { return _underlyingDir.Files; } }
}
1 голос
/ 06 декабря 2010

Итак, у вас есть настройка сайта в IIS, а затем вы создали «приложение» внутри сайта. Вы хотите, чтобы «Приложение» преобразовывало ваши CSS / JavaScript / Изображения в корневой каталог сайта, а не в подпункт «Приложение»?

Зачем вам нужно начинать с тильды?

Почему бы просто не сделать

"/ скрипты / script.js" «/css/main.css"

Так что это всегда происходит из корневого каталога.

0 голосов
/ 09 декабря 2010

Вы не сможете делать то, что хотите, так, как настроен ваш сайт / приложение. Корень приложения - это просто путь к корню вашего приложения. Если вы хотите, чтобы ваш «сайт» и ваше «приложение» оба имели «/» в качестве корня приложения, вам нужно создать два веб-сайта и заставить их слушать различные заголовки хоста (например: mysite.com и myapp.mysite. ком). Таким образом, корень приложения является корнем веб-сайта "/", а не корнем папки приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...