12

내 번들에 포함 된 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를 반환하면 실제 파일을 찾고 있기 때문에 구성된 경로를 사용하지 않는다고 가정합니다. 이것은 구성 또는 구현 문제입니까?

+1

RouteCollection.RouteExistingFiles을 설정함으로써 해결 될 수있다? –

+0

@Christian 불행히도, 아니 –

+0

나는 똑같은 문제를 겪고 있습니다! web.config를 게시 할 수 있습니까? 정적 파일에 ignore.routes를 사용하고 있습니까? RouteExistingFiles = True를 사용하고 있습니까? 약간의 노력을 기울여 이것을 풀어 볼까요? –

답변

12

이처럼 VirtualPathProvider를 사용하도록 BundleTable에게해야합니다

BundleTable.VirtualPathProvider = new EmbeddedVirtualPathProvider(typeof(My.Custom.Type)); 

이 기능은 v1.1.0 of the Microsoft ASP.NET Web Optimization Framework에서 추가되었다.

또한 CSS 파일 요청이 web.config에 추가되어 ASP.NET 파이프 라인을 통과하는지 확인해야합니다.

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 

보조 문제 는이 문제를 해결 한 true

+0

이 코드를 사용할 때 'System.Web.Optimization.BundleTable'에 'VirtualPathProvider'에 대한 정의가 포함되어 있지 않습니다. 그러나 이미' HostingEnvironment.RegisterVirtualPathProvider (new EmbeddedVirtualPathProvider (typeof (My.Custom.Type))); ' –

+0

이전 버전의 해당 프레임 워크를 사용하고 있음을 의미합니다. 또한 왜 당신이 이미 등록 된 VPP를 선택하지 않는지 설명합니다. 이 기능은 프레임 워크의 동일한 버전에 추가되었습니다. – mwijnands

+0

Spot on, 감사합니다. 문제를 해결 한 최적화 프레임 워크의 최신 버전으로 업그레이드했습니다. –