내 번들에 포함 된 dll 리소스를 추가하려면 this blog에 설명 된 기술을 사용하려고합니다.ASP.NET 번들/Minification 및 포함 된 리소스
아래와 같이 사용자 정의 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;
}
}
다음으로 등록하고 번들을 설정하십시오. 직접 HTTP 요청으로 파일을 요청할 때 작동 문서에 설명되어있는 것처럼
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
을 구현했습니다.
문제 : 포함 된 파일이 그들은 단지을 무시하고 , 번들에 포함되지 않습니다. 때 FileExists
방법은 여러 번 호출 디버깅하지만 결코~/Embedded/files/styles/etc/styles.css
을 위해 나는 무엇을 놓치고?
차 문제
은 Microsoft ASP.NET 웹 최적화 프레임 워크의 최신 버전을 사용. VirtualPathProvider
은 예상대로 작동하지만 IRouteHandler
이 실행되지 않습니다. FileExists
메서드가 false를 반환하도록 변경되면 RouteHandler가 실행될 수 있지만 분명히 VirtualPathProvider
이 중단됩니다.
FileExists
이 true를 반환하면 실제 파일을 찾고 있기 때문에 구성된 경로를 사용하지 않는다고 가정합니다. 이것은 구성 또는 구현 문제입니까?
에
RouteCollection.RouteExistingFiles
을 설정함으로써 해결 될 수있다? –@Christian 불행히도, 아니 –
나는 똑같은 문제를 겪고 있습니다! web.config를 게시 할 수 있습니까? 정적 파일에 ignore.routes를 사용하고 있습니까? RouteExistingFiles = True를 사용하고 있습니까? 약간의 노력을 기울여 이것을 풀어 볼까요? –