2010-12-03 132 views
5

因此,ASP.net有一個'應用程序根'的概念。它是對應於爲IIS中的應用程序設置的根目錄的URL的路徑部分。代字符(〜)映射到ASP.net URL中的路徑,所以如果ASP.net認爲我的應用程序位於/ MyApp,那麼服務器控件中的某些URL將作爲「〜/ Scripts/script.js」解析到(並被髮送到瀏覽器)「/MyApp/Scr​​ipts/script.js」。更改ASP.net應用程序根目錄?

這是一個遠射,但有沒有辦法我可以任意改變這個應用程序根目錄?實際上,我在另一個目錄下有一個應用程序,我正在使用URL重寫來使其可用,而無需在目錄名前添加前綴,但是ASP.net總是在我使用〜的任何位置前綴dir名稱的前綴。我真的想解決一個空字符串。一個人可以做到嗎?

回答

6

您應該可以通過編寫自定義VirtualPathProvider來更改〜maps的語義。這可能是它的樣子。我已經在一個簡單的案例中測試過了,但它可能需要打磨。

我建議你在將它移動到真實場景之前,先玩一個簡單的測試應用程序。這將更容易分離問題並對其進行迭代。

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。 COM)。這樣,應用程序根是網站的根,「/」,而不是應用程序文件夾的根。

相關問題