ASP.NET捆绑/缩小和嵌入式资源
我正在尝试使用此博客中描述的技术将嵌入式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
方法更改为返回false,则允许RouteHandler执行,但显然会破坏VirtualPathProvider
。
我假设它没有使用已配置的路由,因为当FileExists
返回true时它正在查找物理文件? 这是配置还是实施问题?
您需要告诉BundleTable使用您的VirtualPathProvider,如下所示:
BundleTable.VirtualPathProvider = new EmbeddedVirtualPathProvider(typeof(My.Custom.Type));
此function已添加到Microsoft ASP.NET Web Optimization Framework的v1.1.0中 。
此外,您需要通过将此文件添加到web.config来确保CSS文件的请求通过ASP.NET管道。
可以通过将RouteCollection.RouteExistingFiles
设置为true
来解决次要问题