Red*_*Taz 13 c# asp.net-mvc virtualpathprovider bundling-and-minification
我正在尝试使用此博客中描述的技术将嵌入式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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我注册并设置捆绑包;
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")
);
}
Run Code Online (Sandbox Code Playgroud)
我还实现了EmbeddedResourceHttpHandler文章中描述的自定义,该文章在将文件作为直接http请求请求时有效.
问题:
嵌入的文件未包含在捆绑包中,它们只是被忽略.调试时,多次调用该FileExists 方法但从不调用 ~/Embedded/files/styles/etc/styles.css
我错过了什么?
次要问题
使用最新版本的Microsoft ASP.NET Web Optimization Framework时.该VirtualPathProvider作品如预期,但它可以防止IRouteHandler从执行.如果将FileExists方法更改为返回false,则允许RouteHandler执行但显然会中断VirtualPathProvider.
我假设它没有使用已配置的路由,因为它在FileExists返回true 时正在查找物理文件?这是配置还是实施问题?
mwi*_*nds 12
您需要告诉BundleTable使用您的VirtualPathProvider,如下所示:
BundleTable.VirtualPathProvider = new EmbeddedVirtualPathProvider(typeof(My.Custom.Type));
Run Code Online (Sandbox Code Playgroud)
此功能已添加到Microsoft ASP.NET Web Optimization Framework的v1.1.0中.
此外,您需要通过将此文件添加到web.config来确保CSS文件的请求通过ASP.NET管道.
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
Run Code Online (Sandbox Code Playgroud)
次要问题可以通过设置RouteCollection.RouteExistingFiles为true
| 归档时间: |
|
| 查看次数: |
2444 次 |
| 最近记录: |