Empacotamento / Minificação do ASP.NET e Recursos Incorporados
Estou tentando usar a técnica descrita emeste blog para adicionar recursos de DLL incorporados aos meus pacotes.
Eu criei o costumeVirtualPathProvider
abaixo.
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;
}
}
Eu então registro isso e configuro os pacotes;
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")
);
}
Eu também implementei um costumeEmbeddedResourceHttpHandler
conforme descrito no artigo que funciona ao solicitar o arquivo como uma solicitação http direta.
Problema: Os arquivos incorporados não estão sendo incluídos no pacote,eles são apenas ignorados. Ao depurar oFileExists
O método é chamado várias vezes, mas nunca para ~/Embedded/files/styles/etc/styles.css
o que estou perdendo?
Problema Secundário
Ao usar a versão mais recente do Microsoft ASP.NET Web Optimization Framework. oVirtualPathProvider
funciona como esperado, porém impede aIRouteHandler
de executar. Se oFileExists
O método é alterado para retornar false. Isso permite que o RouteHandler execute, mas obviamente quebra oVirtualPathProvider
.
Estou assumindo que não está usando uma rota configurada porque está procurando um arquivo físico quandoFileExists
retorna verdadeiro? Este é um problema de configuração ou implementação?