C# ASP.NET捆绑/缩小和嵌入式资源
我正在尝试使用中描述的技术将嵌入式dll资源添加到我的包中 我已经在下面创建了自定义的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; }
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。该功能已添加到同一版本的框架中。请注意,谢谢。我已经升级到最新版本的优化框架,解决了这个问题