簡體   English   中英

ASP.NET捆綁/縮小和嵌入式資源

[英]ASP.NET Bundling/Minification and Embedded Resources

我正在嘗試使用此博客中描述的技術將嵌入式DLL資源添加到我的捆綁包中。

我在下面創建了自定義VirtualPathProvider

public class EmbeddedVirtualPathProvider : VirtualPathProvider {

    private Type _rootType;

    public EmbeddedVirtualPathProvider(Type rootType) {
        _rootType = rootType;
    }

    public override bool FileExists(string virtualPath) {
        if (IsEmbeddedPath(virtualPath))
            return true;
        else
            return Previous.FileExists(virtualPath);
    }

    public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) {
        if (IsEmbeddedPath(virtualPath)) {
            return null;
        }
        else {
            return Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
        }
    }

    public override VirtualDirectory GetDirectory(string virtualDir) {
        return Previous.GetDirectory(virtualDir);
    }

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

    public override VirtualFile GetFile(string virtualPath) {
        if (IsEmbeddedPath(virtualPath)) {
            string fileNameWithExtension = virtualPath.Substring(virtualPath.LastIndexOf("/") + 1);

            string nameSpace = _rootType.Namespace;
            string manifestResourceName = String.Format("{0}.{1}", nameSpace, fileNameWithExtension);
            var stream = _rootType.Assembly.GetManifestResourceStream(manifestResourceName);
            return new EmbeddedVirtualFile(virtualPath, stream);
        }
        else
            return Previous.GetFile(virtualPath);
    }

    private bool IsEmbeddedPath(string path) {
        return path.Contains("~/Embedded");
    }
}

public class EmbeddedVirtualFile : VirtualFile {
    private Stream _stream;
    public EmbeddedVirtualFile(string virtualPath, Stream stream)
        : base(virtualPath) {
        _stream = stream;
    }

    public override Stream Open() {
        return _stream;
    }
} 

然后我注冊並設置捆綁包;

public static void RegisterBundles(BundleCollection bundles) {

    HostingEnvironment.RegisterVirtualPathProvider(new EmbeddedVirtualPathProvider(typeof(My.Custom.Type)));

    bundles.Add(new StyleBundle("~/Embedded/css").Include(
        "~/Embedded/files/styles/etc/styles.css")
    );
}

我還實現了一個自定義EmbeddedResourceHttpHandler ,如本文所述,當請求文件作為直接http請求時,它可以正常工作。

問題:嵌入的文件未包含在捆綁包中, 它們只是被忽略 調試時, FileExists 調用 FileExists 方法,但從不調用 ~/Embedded/files/styles/etc/styles.css

我錯過了什么?

次要問題

使用最新版本的Microsoft ASP.NET Web Optimization Framework時。 VirtualPathProvider按預期工作,但它阻止IRouteHandler執行。 如果將FileExists方法更改為return false,則允許RouteHandler執行,但顯然會破壞VirtualPathProvider

我假設它沒有使用已配置的路由,因為當FileExists返回true時它正在查找物理文件? 這是配置還是實施問題?

您需要告訴BundleTable使用您的VirtualPathProvider,如下所示:

BundleTable.VirtualPathProvider = new EmbeddedVirtualPathProvider(typeof(My.Custom.Type));

此功能已添加到Microsoft ASP.NET Web Optimization Framework的v1.1.0中

此外,您需要通過將此文件添加到web.config來確保CSS文件的請求通過ASP.NET管道。

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">

可以通過將RouteCollection.RouteExistingFiles設置為true來解決次要問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM