加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 如何将包含动态内容的包添加到asp.net Web优化中

发布时间:2020-12-16 09:53:30 所属栏目:asp.Net 来源:网络整理
导读:我正在使用SignalR,它在虚拟路径“?/ signalr”上映射到asp.net应用程序. SignalR在应用程序启动时动态创建 javascript代理集线器,虚拟路径为“?/ signalr / hubs”. 所以url“[http:// myapp] / signalr / hubs”是动态javascript内容的所在. 如何将此虚拟
我正在使用SignalR,它在虚拟路径“?/ signalr”上映射到asp.net应用程序.
SignalR在应用程序启动时动态创建 javascript代理集线器,虚拟路径为“?/ signalr / hubs”.

所以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.有人可以详细解释或更好地举例吗?

解决方法

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

>编写请求/构建所需内容的逻辑.对于SignalR,您可以使用此代码段:

public static string GetSignalRContent()
{
    var resolver = new DefaultHubManager(new DefaultDependencyResolver());
    var proxy = new DefaultJavaScriptProxyGenerator(resolver,new NullJavaScriptMinifier());
    return proxy.GenerateProxy("/signalr");
}

>实现一个虚拟路径提供程序,它包装现有的虚拟路径提供程序并拦截应该提供动态内容的所有虚拟路径(在您的情况下只是“?/ 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;
    }
}

>注册您的虚拟路径提供商:

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 Resources或Bundling Dynamic Generated Controller / Action Content.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读