【问题标题】:How to add bundles with dynamic content to asp.net web optimization如何将具有动态内容的捆绑包添加到 asp.net 网络优化
【发布时间】:2013-11-08 03:42:47
【问题描述】:

我正在使用 SignalR,它映射到虚拟路径“~/signalr”上的 asp.net 应用程序。 SignalR 以虚拟路径“~/signalr/hubs”在应用开始时动态创建 javascript 代理集线器。

所以 url "[http://myapp]/signalr/hubs" 是动态 javascript 内容所在的位置。 如何将此虚拟路径添加到 Asp.Net Web Optimization Bundling?

从 1.1 开始的 Asp.Net Web 优化框架支持 VirtuPathProvider 的: ASP.NET bundling/minification: including dynamically generated Javascript

其实我不明白如何使用这些 VPP。有人可以详细解释一下还是举个例子更好?

【问题讨论】:

    标签: asp.net-mvc .net-4.5 bundling-and-minification asp.net-optimization


    【解决方案1】:

    我不确定是否有办法做到这一点,但另一种选择是在构建时生成 /signalr/hubs javascript。这样你就可以打包生成的js文件了。

    请参阅http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-javascript-client 中的“如何为 SignalR 生成的代理创建物理文件”部分。

    【讨论】:

    • 在运行时抓取生成的 js 脚本并将其包含在解决方案中是不可接受的。在我们的应用程序中,我们有几个东西可以生成动态 javascript 内容,而不仅仅是 SignalR。
    【解决方案2】:

    将动态内容集成到捆绑过程中需要以下步骤:

    1. 编写请求/构建所需内容的逻辑。对于 SignalR,您可以使用以下代码 sn-p:

      public static string GetSignalRContent()
      {
          var resolver = new DefaultHubManager(new DefaultDependencyResolver());
          var proxy = new DefaultJavaScriptProxyGenerator(resolver, new NullJavaScriptMinifier());
          return proxy.GenerateProxy("/signalr");
      }
      
    2. 实现一个虚拟路径提供者,它包装现有的路径并拦截所有应该传递动态内容的虚拟路径(在你的例子中只是“~/signalr/hubs”)。

      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 示例。

    【讨论】:

    • 这是否适用于生成动态css?我找不到 Style/Css minifier 的对应对象。
    猜你喜欢
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 2015-08-11
    • 2012-11-05
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2016-09-18
    相关资源
    最近更新 更多