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。 –