4

我正在使用SignalR,它映射到虛擬路徑「〜/ signalr」上的asp.net應用程序。 SignalR在虛擬路徑「〜/ signalr/hubs」上動態創建應用程序上的javascript代理中心。如何添加動態內容捆綁到asp.net網頁優化

所以url "[http://myapp]/signalr/hubs"是動態javascript內容的地方。 如何將此虛擬路徑添加到Asp.Net Web優化捆綁?

Asp.Net網站優化框架,從1.1開始支持VirtuPathProvider的: ASP.NET bundling/minification: including dynamically generated Javascript

其實我也不知道如何使用這些VPP的。有人可以詳細解釋或更好地舉個例子嗎?

回答

2

的動態內容到捆紮工藝集成需要下列步驟:

  1. 寫請求/建立所要求的內容的邏輯。對於SignalR你可以使用此代碼段:

    public static string GetSignalRContent() 
    { 
        var resolver = new DefaultHubManager(new DefaultDependencyResolver()); 
        var proxy = new DefaultJavaScriptProxyGenerator(resolver, new NullJavaScriptMinifier()); 
        return proxy.GenerateProxy("/signalr"); 
    } 
    
  2. 實現一個包裝現有的虛擬路徑提供者和攔截應提供動態內容的所有虛擬路徑(只是在你的情況下,「〜/ signalr /集線器」 )。

    public class CustomVirtualPathProvider : VirtualPathProvider 
    { 
        public CustomActionVirtualPathProvider(VirtualPathProvider virtualPathProvider) 
        { 
         // Wrap an existing virtual path provider 
         VirtualPathProvider = virtualPathProvider; 
        } 
    
        protected VirtualPathProvider VirtualPathProvider { get; set; } 
    
        public override string CombineVirtualPaths(string basePath, string relativePath) 
        { 
         return VirtualPathProvider.CombineVirtualPaths(basePath, relativePath); 
        } 
    
        public override bool DirectoryExists(string virtualDir) 
        { 
         return VirtualPathProvider.DirectoryExists(virtualDir); 
        } 
    
        public override bool FileExists(string virtualPath) 
        { 
         if (virtualPath == "~/signalr/hubs") 
         { 
          return true; 
         } 
    
         return VirtualPathProvider.FileExists(virtualPath); 
        } 
    
        public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) 
        { 
         // BaseClass can't create a CacheDependency for your content, remove it 
         // You could also add your own CacheDependency and aggregate it with the base dependency 
         List<string> virtualPathDependenciesCopy = virtualPathDependencies.Cast<string>().ToList(); 
         virtualPathDependenciesCopy.Remove("~/signalr/hubs"); 
    
         return VirtualPathProvider.GetCacheDependency(virtualPath, virtualPathDependenciesCopy, utcStart); 
        } 
    
        public override string GetCacheKey(string virtualPath) 
        { 
         return VirtualPathProvider.GetCacheKey(virtualPath); 
        } 
    
        public override VirtualDirectory GetDirectory(string virtualDir) 
        { 
         return VirtualPathProvider.GetDirectory(virtualDir); 
        } 
    
        public override VirtualFile GetFile(string virtualPath) 
        { 
         if (virtualPath == "~/signalr/hubs") 
         { 
          return new CustomVirtualFile(virtualPath, 
           new MemoryStream(Encoding.Default.GetBytes(GetSignalRContent()))); 
         } 
    
         return VirtualPathProvider.GetFile(virtualPath); 
        } 
    
        public override string GetFileHash(string virtualPath, IEnumerable virtualPathDependencies) 
        { 
         return VirtualPathProvider.GetFileHash(virtualPath, virtualPathDependencies); 
        } 
    
        public override object InitializeLifetimeService() 
        { 
         return VirtualPathProvider.InitializeLifetimeService(); 
        } 
    } 
    
    public class CustomVirtualFile : VirtualFile 
    { 
        public CustomVirtualFile (string virtualPath, Stream stream) 
         : base(virtualPath) 
        { 
         Stream = stream; 
        } 
    
        public Stream Stream { get; private set; } 
    
        public override Stream Open() 
        { 
         return Stream; 
        } 
    } 
    
  3. 註冊虛擬路徑提供:

    public static void RegisterBundles(BundleCollection bundles) 
    { 
        // Set the virtual path provider 
        BundleTable.VirtualPathProvider = 
         new CustomVirtualPathProvider(BundleTable.VirtualPathProvider); 
    
        Bundle include = new Bundle("~/bundle") 
         .Include("~/Content/static.js") 
         .Include("~/signalr/hubs"); 
    
        bundles.Add(include); 
    } 
    

對於虛擬路徑提供的一些樣品+捆綁,例如參見Bundling and Minification and Embedded ResourcesBundling Dynamic Generated Controller/Action Content

+0

這是否與生成動態的CSS?我無法找到Style/Css縮小器的相應對象。 – DonDon

0

我不確定是否有辦法做到這一點,但另一種選擇是在構建時生成/ signalr/hubs javascript。這樣你可以捆綁生成的js文件。

請參閱http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-javascript-client中的「如何爲SignalR生成的代理創建物理文件」部分。

+0

在運行時抓住生成的js腳本並將它們包含到解決方案中是不可接受的。我們有幾件事情可以在我們的應用程序中生成動態JavaScript內容,而不僅僅是SignalR。 –