2010-12-03 4 views
5

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

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

ответ

6

Вы должны иметь возможность изменить семантику того, что ~ сопоставляет, написав пользовательский 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

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

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

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

"/scripts/script.js" "/css/main.css"

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

+0

Согласен, и я также использую то же самое без тильды. – 2010-12-06 00:36:32

0

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

Смежные вопросы