Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET捆绑/缩小和嵌入式资源_C#_Asp.net Mvc_Bundling And Minification_Virtualpathprovider - Fatal编程技术网

C# ASP.NET捆绑/缩小和嵌入式资源

C# ASP.NET捆绑/缩小和嵌入式资源,c#,asp.net-mvc,bundling-and-minification,virtualpathprovider,C#,Asp.net Mvc,Bundling And Minification,Virtualpathprovider,我正在尝试使用中描述的技术将嵌入式dll资源添加到我的包中 我已经在下面创建了自定义的VirtualPathProvider public class EmbeddedVirtualPathProvider : VirtualPathProvider { private Type _rootType; public EmbeddedVirtualPathProvider(Type rootType) { _rootType = rootType; }

我正在尝试使用中描述的技术将嵌入式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
方法,但从不调用
~/Embedded/files/styles/etc/styles.css

我错过了什么

次要问题

使用最新版本的Microsoft ASP.NET Web优化框架时。
VirtualPathProvider
按预期工作,但它阻止执行
iroutHandler
。如果
FileExists
方法更改为返回false,这将允许RouteHandler执行,但显然会破坏
VirtualPathProvider


我假设它没有使用配置的路由,因为当
FileExists
返回true时,它正在查找物理文件?这是配置问题还是实现问题?

您需要告诉BundleTable以如下方式使用您的VirtualPathProvider:

BundleTable.VirtualPathProvider = new EmbeddedVirtualPathProvider(typeof(My.Custom.Type));
此功能已添加到中

此外,您还需要将CSS文件的请求添加到web.config中,以确保CSS文件的请求通过ASP.NET管道

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


第二个问题可以通过将
RouteCollection.RouteExistingFiles
设置为
true

来解决。您解决了这个问题吗?@Christian不幸的是,没有,我遇到了完全相同的问题!你能发布你的web.config吗?是否对静态文件使用了一些ignore.routes?您是否使用RouteExistingFiles=True?让我们努力解决这个问题吧?我已经发布了一些我尝试的代码,并在以下位置提出了一个问题:。它可能会帮助你。。。如果您发现了什么,请保持联系。在使用此代码时,我得到的“System.Web.Optimization.BundleTable”不包含“VirtualPathProvider”的定义,但是我已经在使用
HostingEnvironment.RegisterVirtualPathProvider(新的嵌入式VirtualPathProvider(typeof(my.Custom.Type)))注册我的提供商这意味着您正在使用该框架的旧版本。这也解释了为什么它不接收您已经注册的VPP。该功能已添加到同一版本的框架中。请注意,谢谢。我已经升级到最新版本的优化框架,解决了这个问题