如何将包含动态内容的捆绑包添加到 asp.net 网络优化 [英] How to add bundles with dynamic content to asp.net web optimization
问题描述
我正在使用 SignalR,它映射到虚拟路径~/signalr"上的 asp.net 应用程序.SignalR 以虚拟路径~/signalr/hubs"开始在应用程序上动态创建 javascript 代理集线器.
I'm using SignalR, which maps to asp.net application on virtual path "~/signalr". SignalR dynamically creates javascript proxy hubs on app start with virtual path "~/signalr/hubs".
所以 url "[http://myapp]/signalr/hubs"
是动态 javascript 内容所在的位置.如何将此虚拟路径添加到 Asp.Net Web Optimization Bundling?
So the url "[http://myapp]/signalr/hubs"
is where dynamic javascript content is.
How can I add this virtual path to Asp.Net Web Optimization Bundling?
Asp.Net Web 优化框架从 1.1 开始支持 VirtuPathProvider 的:ASP.NET 捆绑/缩小:包括动态生成的 Javascript
Asp.Net Web Optimization Framework starting from 1.1 supports VirtuPathProvider's: ASP.NET bundling/minification: including dynamically generated Javascript
实际上我不明白如何使用这些 VPP.有人能详细解释一下还是最好举个例子?
Actually I don't understand how to use these VPP's. Could somebody explain in details or better give an example?
推荐答案
将动态内容集成到捆绑流程中需要以下步骤:
Integration of dynamic content into the bundling process requires the following steps:
编写请求/构建所需内容的逻辑.对于 SignalR,您可以使用以下代码片段:
Writing the logic that requests / builds the required content. For SignalR you could use this code snippet:
public static string GetSignalRContent()
{
var resolver = new DefaultHubManager(new DefaultDependencyResolver());
var proxy = new DefaultJavaScriptProxyGenerator(resolver, new NullJavaScriptMinifier());
return proxy.GenerateProxy("/signalr");
}
实现一个虚拟路径提供程序,它包装现有路径并拦截所有应该提供动态内容的虚拟路径(在您的情况下只是~/signalr/hubs").
Implement a virtual path provider that wraps the existing one and intercept all virtual paths that should deliver the dynamic content (just "~/signalr/hubs" in your case).
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;
}
}
注册您的虚拟路径提供者:
Register your virtual path provider:
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);
}
有关虚拟路径提供程序 + 捆绑的一些示例,请参阅 捆绑和缩小以及嵌入资源 或捆绑动态生成的控制器/动作内容例如.
For some samples of virtual path providers + bundling, see Bundling and Minification and Embedded Resources or Bundling Dynamic Generated Controller / Action Content for example.
这篇关于如何将包含动态内容的捆绑包添加到 asp.net 网络优化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!