4

仮想パス「~/signalr」のasp.netアプリケーションにマップするSignalRを使用しています。SignalR は、仮想パス "~/signalr/hubs" を使用してアプリの開始時に JavaScript プロキシ ハブを動的に作成します。

したがって、URL"[http://myapp]/signalr/hubs"は動的な JavaScript コンテンツがある場所です。この仮想パスを Asp.Net Web 最適化バンドルに追加するにはどうすればよいですか?

1.1 以降の Asp.Net Web 最適化フレームワークは、VirtuPathProvider をサポートしています: ASP.NET のバンドル/縮小: 動的に生成された Javascript を含む

実際、これらの VPP の使用方法がわかりません。誰かが詳細に説明したり、より良い例を挙げたりできますか?

4

2 に答える 2

3

動的コンテンツをバンドル プロセスに統合するには、次の手順が必要です。

  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/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);
    }
    

仮想パス プロバイダー + バンドルのサンプルについては、たとえば、バンドルと縮小および組み込みリソースまたは動的に生成されたコントローラー/アクション コンテンツのバンドルを参照してください。

于 2014-12-16T15:20:00.390 に答える
0

それを行う方法があるかどうかはわかりませんが、別の方法は、ビルド時に /signalr/hubs JavaScript を生成することです。そうすれば、生成された js ファイルをバンドルするだけです。

http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-javascript-clientの「SignalR 生成プロキシの物理ファイルを作成する方法」セクションを参照してください

于 2014-04-24T09:37:49.003 に答える